Перем ЧислоРеквизитов Экспорт;
Перем ПредставленияЗаголовковРеквизитов Экспорт;
Перем КодПриведенияРеквизитаКТипуЧисло;

#Область Основные_процедуры_и_функции
Процедура СравнитьДанныеНаСервере(ТекстОшибок = "") Экспорт
	
	//Сообщения при ошибке в произвольном коде незачем показывать больше одного раза, они скорее всего будут одинаковые
	СообщениеОбОшибкеПриВыполненииКодаДляВыводаСтрок = Ложь;
	СообщениеОбОшибкеПриВыполненииКодаДляЗапретаВыводаСтрок = Ложь;
	СообщениеОНаличииНесколькихСтрокПоОдномуКлючу = Ложь;
		
	Если Не ПроверитьЗаполнениеРеквизитов() Тогда
		Возврат;
	КонецЕсли;
	
	СмещениеНомераРеквизита = ЧислоСтолбцовВключе - 1;
	ЧислоУдаленныхСтрокТаблицыРасхождений = 0;
	ИмяКолонкиКоличествоСтрокИсточникаДанных = "КоличествоСтрокИсточникаДанных_" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
	
	ТекстОшибки = "";
	ПодключениеА = Неопределено;
	ТЗ_А = ПрочитатьДанныеИПолучитьТЗ("А", ТекстОшибки, ПодключениеА);
	
	Если ТЗ_А = Неопределено Тогда
		ТекстОшибок = ТекстОшибок + ?(ПустаяСтрока(ТекстОшибок), "", Символы.ПС) + ТекстОшибки;
	КонецЕсли;
	
	ТекстОшибки = "";
	ПодключениеБ = Неопределено;
	ТЗ_Б = ПрочитатьДанныеИПолучитьТЗ("Б", ТекстОшибки, ПодключениеБ);
	
	Если ТЗ_Б = Неопределено Тогда
		ТекстОшибок = ТекстОшибок + ?(ПустаяСтрока(ТекстОшибок), "", Символы.ПС) + ТекстОшибки;
	КонецЕсли;
	
	Если ТЗ_А = Неопределено Или ТЗ_Б = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекстСообщения = СтрШаблон("Общее число записей (с учетом дубликатов): А: %1, Б: %2", ТЗ_А.Количество(), ТЗ_Б.Количество());
	Сообщить(Формат(ТекущаяДата(),"ДЛФ=DT") + ": " + ТекстСообщения);
	
	
#Область ТЗ_А_Сгруппированная
	
	ТЗ_А_Сгруппированная = ТЗ_А.Скопировать();
	ТЗ_А_Сгруппированная.Колонки.Добавить(ИмяКолонкиКоличествоСтрокИсточникаДанных);
	
	ИмяКлючаА1 = ТЗ_А_Сгруппированная.Колонки.Get(0).Name;
	КолонкиСКлючомАСтрокой = ИмяКлючаА1;
	
	Если ЧислоСтолбцовВКлюче > 1 Тогда
		ИмяКлючаА2 = ТЗ_А_Сгруппированная.Колонки.Get(1).Name;
		КолонкиСКлючомАСтрокой = КолонкиСКлючомАСтрокой + "," + ИмяКлючаА2;
	КонецЕсли;
	
	Если ЧислоСтолбцовВКлюче > 2 Тогда
		ИмяКлючаА3 = ТЗ_А_Сгруппированная.Колонки.Get(2).Name;
		КолонкиСКлючомАСтрокой = КолонкиСКлючомАСтрокой + "," + ИмяКлючаА3;
	КонецЕсли;
		
	ТЗ_А_Сгруппированная.ЗаполнитьЗначения(1,ИмяКолонкиКоличествоСтрокИсточникаДанных);	
	ТЗ_А_Сгруппированная.Свернуть(КолонкиСКлючомАСтрокой, ИмяКолонкиКоличествоСтрокИсточникаДанных);	
	ТЗ_А_Сгруппированная.Индексы.Добавить(КолонкиСКлючомАСтрокой);
	
#КонецОбласти


#Область ТЗ_Б_Сгруппированная

	ТЗ_Б_Сгруппированная = ТЗ_Б.Скопировать();
	ТЗ_Б_Сгруппированная.Колонки.Добавить(ИмяКолонкиКоличествоСтрокИсточникаДанных);
	
	ИмяКлючаБ1 = ТЗ_Б_Сгруппированная.Колонки.Get(0).Name;
	КолонкиСКлючомБСтрокой = ИмяКлючаБ1;
	Если ЧислоСтолбцовВКлюче > 1 Тогда
		ИмяКлючаБ2 = ТЗ_Б_Сгруппированная.Колонки.Get(1).Name;
		КолонкиСКлючомБСтрокой = КолонкиСКлючомБСтрокой + "," + ИмяКлючаБ2;
	КонецЕсли;
	Если ЧислоСтолбцовВКлюче > 2 Тогда
		ИмяКлючаБ3 = ТЗ_Б_Сгруппированная.Колонки.Get(2).Name;
		КолонкиСКлючомБСтрокой = КолонкиСКлючомБСтрокой + "," + ИмяКлючаБ3;
	КонецЕсли;
			
	ТЗ_Б_Сгруппированная.ЗаполнитьЗначения(1, ИмяКолонкиКоличествоСтрокИсточникаДанных);
	ТЗ_Б_Сгруппированная.Свернуть(КолонкиСКлючомБСтрокой, ИмяКолонкиКоличествоСтрокИсточникаДанных);
	ТЗ_Б_Сгруппированная.Индексы.Добавить(КолонкиСКлючомБСтрокой);
	
#КонецОбласти


	ТекстСообщения = СтрШаблон("Число уникальных записей (по ключу): А: %1, Б: %2", ТЗ_А.Количество(), ТЗ_Б.Количество());
	Сообщить(Формат(ТекущаяДата(),"ДЛФ=DT") + ": " + ТекстСообщения);

	ЧислоКолонокТЗ_А = ТЗ_А.Колонки.Count();
	ЧислоКолонокТЗ_Б = ТЗ_Б.Колонки.Count();
	
	ИтогиПоРеквизитамСоответствие = Новый Соответствие;
	Для СчетчикРеквизитов = 1 По ЧислоРеквизитов Цикл
		
		ЭтотОбъект["ВидимостьРеквизитА" + СчетчикРеквизитов] = ЭтотОбъект["ВидимостьРеквизитА" + СчетчикРеквизитов] И ЧислоКолонокТЗ_А >= СчетчикРеквизитов;
		ЭтотОбъект["ВидимостьРеквизитБ" + СчетчикРеквизитов] = ЭтотОбъект["ВидимостьРеквизитБ" + СчетчикРеквизитов] И ЧислоКолонокТЗ_Б >= СчетчикРеквизитов;
		
		ИтогиПоРеквизитамСоответствие.Вставить("РеквизитА" + СчетчикРеквизитов, Новый Структура(
			"ОшибкаПриВычислении,РассчитыватьИтог,АгрегатнаяФункцияРасчетаИтога,ЗначениеИтога,СуммаЗначений,ЧислоЗначений", 
			Ложь, ?(НастройкиФайлаА.Количество() < СчетчикРеквизитов, Ложь, НастройкиФайлаА[СчетчикРеквизитов - 1].РассчитыватьИтог), ?(НастройкиФайлаА.Количество() < СчетчикРеквизитов, "Сумма", НастройкиФайлаА[СчетчикРеквизитов - 1].АгрегатнаяФункцияРасчетаИтога), Неопределено, 0, 0));
		ИтогиПоРеквизитамСоответствие.Вставить("РеквизитБ" + СчетчикРеквизитов, Новый Структура(
			"ОшибкаПриВычислении,РассчитыватьИтог,АгрегатнаяФункцияРасчетаИтога,ЗначениеИтога,СуммаЗначений,ЧислоЗначений", 
			Ложь, ?(НастройкиФайлаБ.Количество() < СчетчикРеквизитов, Ложь, НастройкиФайлаБ[СчетчикРеквизитов - 1].РассчитыватьИтог), ?(НастройкиФайлаБ.Количество() < СчетчикРеквизитов, "Сумма", НастройкиФайлаБ[СчетчикРеквизитов - 1].АгрегатнаяФункцияРасчетаИтога), Неопределено, 0, 0));
		
	КонецЦикла;
	
	Результат.Очистить();
	
	
#Область _1_2_3_4_6_7
	
	Если РеляционнаяОперация = 1 Или РеляционнаяОперация = 2 Или РеляционнаяОперация = 3 Или РеляционнаяОперация = 4 Или РеляционнаяОперация = 6 Или РеляционнаяОперация = 7 Тогда
						
		Для Каждого СтрокаТЗ_А_Сгруппированная Из ТЗ_А_Сгруппированная Цикл 		
			           			
			Ключ1 = СтрокаТЗ_А_Сгруппированная[ИмяКлючаА1];
			
			Если ЧислоСтолбцовВКлюче > 1 Тогда
				Ключ2 = СтрокаТЗ_А_Сгруппированная[ИмяКлючаА2];				
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
				Ключ3 = СтрокаТЗ_А_Сгруппированная[ИмяКлючаА3];
			КонецЕсли;

			Если ПодключениеБ = Неопределено Тогда
				ОтборСтруктура = Новый Структура;
			Иначе
				ОтборСтруктура = ПодключениеБ.NewObject("Структура");
			КонецЕсли;
			ОтборСтруктура.Вставить(ИмяКлючаБ1, Ключ1);
			Если ЧислоСтолбцовВКлюче > 1 Тогда
				ОтборСтруктура.Вставить(ИмяКлючаБ2, Ключ2);
			КонецЕсли;
			Если ЧислоСтолбцовВКлюче > 2 Тогда
				ОтборСтруктура.Вставить(ИмяКлючаБ3, Ключ3);
			КонецЕсли;
			
			НайденныеСтроки = ТЗ_Б_Сгруппированная.FindRows(ОтборСтруктура);
			СтрокаТЗ_Б_Сгруппированная = ?(НайденныеСтроки.Count() > 0, НайденныеСтроки.Get(0), Неопределено);
			
			Если РеляционнаяОперация = 2 Или РеляционнаяОперация = 3
				Или ((РеляционнаяОперация = 1 Или РеляционнаяОперация = 7) И СтрокаТЗ_Б_Сгруппированная = Неопределено) 
				Или ((РеляционнаяОперация = 4 Или РеляционнаяОперация = 6) И СтрокаТЗ_Б_Сгруппированная <> Неопределено) Тогда
				
				СтрокаТР = Результат.Добавить();
				
			Иначе
				Продолжить;
			КонецЕсли;
			
			СтрокаТР.Ключ1 = Ключ1;
			Если ОтображатьТипыСтолбцовКлюча Тогда
				СтрокаТР.ТипСтолбца1Ключа = ТипЗнч(СтрокаТР.Ключ1);
			КонецЕсли;
			Если ЧислоСтолбцовВКлюче > 1 Тогда
				СтрокаТР.Ключ2 = Ключ2;
				Если ОтображатьТипыСтолбцовКлюча Тогда
					СтрокаТР.ТипСтолбца2Ключа = ТипЗнч(СтрокаТР.Ключ2);
				КонецЕсли;
			КонецЕсли;
			Если ЧислоСтолбцовВКлюче > 2 Тогда
				СтрокаТР.Ключ3 = Ключ3;
				Если ОтображатьТипыСтолбцовКлюча Тогда
					СтрокаТР.ТипСтолбца3Ключа = ТипЗнч(СтрокаТР.Ключ3);
				КонецЕсли;
			КонецЕсли;
			
			СтрокаТР.ЧислоЗаписейА = СтрокаТЗ_А_Сгруппированная[ИмяКолонкиКоличествоСтрокИсточникаДанных];
			Если СтрокаТЗ_Б_Сгруппированная <> Неопределено Тогда
				СтрокаТР.ЧислоЗаписейБ = СтрокаТЗ_Б_Сгруппированная[ИмяКолонкиКоличествоСтрокИсточникаДанных];
			КонецЕсли;
			
			Если ЧислоКолонокТЗ_А > 1 Тогда
								
				Если ПодключениеА = Неопределено Тогда
					ОтборСтруктура = Новый Структура;
				Иначе
					ОтборСтруктура = ПодключениеА.NewObject("Структура");
				КонецЕсли;
				ОтборСтруктура.Вставить(ИмяКлючаА1, Ключ1);
				Если ЧислоСтолбцовВКлюче > 1 Тогда
					ОтборСтруктура.Вставить(ИмяКлючаА2, Ключ2);
				КонецЕсли;
				Если ЧислоСтолбцовВКлюче > 2 Тогда
					ОтборСтруктура.Вставить(ИмяКлючаА3, Ключ3);
				КонецЕсли;
				
				НайденныеСтроки = ТЗ_А.FindRows(ОтборСтруктура);
				СтрокаТЗ_А = ?(НайденныеСтроки.Count() > 0, НайденныеСтроки.Get(0), Неопределено);
				
				//Значения реквизитов выводятся только при наличии единственной записи по ключу
				Если СтрокаТР.ЧислоЗаписейА = 1 Тогда
					Для СчетчикКолонокА = 1 По Мин(ЧислоРеквизитов, ЧислоКолонокТЗ_А - ЧислоСтолбцовВключе) Цикл
						СтрокаТР["РеквизитА" + СчетчикКолонокА] = СтрокаТЗ_А.Get(СчетчикКолонокА + СмещениеНомераРеквизита);
					КонецЦикла;
				КонецЕсли;
				
			КонецЕсли;
						
			Если ЧислоКолонокТЗ_Б > 1 Тогда
								
				Если ПодключениеБ = Неопределено Тогда
					ОтборСтруктура = Новый Структура;
				Иначе
					ОтборСтруктура = ПодключениеБ.NewObject("Структура");
				КонецЕсли;
				ОтборСтруктура.Вставить(ИмяКлючаБ1, Ключ1);
				Если ЧислоСтолбцовВКлюче > 1 Тогда
					ОтборСтруктура.Вставить(ИмяКлючаБ2, Ключ2);
				КонецЕсли;
				Если ЧислоСтолбцовВКлюче > 2 Тогда
					ОтборСтруктура.Вставить(ИмяКлючаБ3, Ключ3);
				КонецЕсли;
				
				НайденныеСтроки = ТЗ_Б.FindRows(ОтборСтруктура);
				СтрокаТЗ_Б = ?(НайденныеСтроки.Count() > 0, НайденныеСтроки.Get(0), Неопределено);
							
				Если СтрокаТЗ_Б <> Неопределено Тогда
					
					//Значения реквизитов выводятся только при наличии единственной записи по ключу
					Если СтрокаТР.ЧислоЗаписейБ = 1 Тогда
						Для СчетчикКолонокБ = 1 По Мин(ЧислоРеквизитов, ЧислоКолонокТЗ_Б - ЧислоСтолбцовВключе) Цикл
							СтрокаТР["РеквизитБ" + СчетчикКолонокБ] = СтрокаТЗ_Б.Get(СчетчикКолонокБ + СмещениеНомераРеквизита);
						КонецЦикла;
					КонецЕсли;
					
				КонецЕсли;
				
			КонецЕсли;
						
			УсловияВыводаСтрокиВыполнены = Истина;
			
			Если Не УсловияВыводаСтрокОтключены Тогда 
				Попытка
					Выполнить КодДляВыводаСтрок;
				Исключение
					Если Не СообщениеОбОшибкеПриВыполненииКодаДляВыводаСтрок Тогда
						ТекстОшибки = ОписаниеОшибки();
						Сообщить(Формат(ТекущаяДата(),"ДЛФ=DT") + ": " + ТекстОшибки);
					КонецЕсли;
					СообщениеОбОшибкеПриВыполненииКодаДляВыводаСтрок = Истина;
				КонецПопытки;
			КонецЕсли;
			
			//Если число строк с одним ключом больше 1, результирующую строку нужно вывести обязательно, 
			//т.к. условия в данном случае некорректно применять вообще
			Если СтрокаТР.ЧислоЗаписейА <= 1 И СтрокаТР.ЧислоЗаписейБ <= 1 Тогда
				
				УсловияЗапретаВыводаСтрокиВыполнены = Ложь;
				
				Если Не УсловияЗапретаВыводаСтрокОтключены Тогда 
					Попытка
						Выполнить КодДляЗапретаВыводаСтрок; 
					Исключение
						Если Не СообщениеОбОшибкеПриВыполненииКодаДляЗапретаВыводаСтрок Тогда
							ТекстОшибки = ОписаниеОшибки();
							Сообщить(Формат(ТекущаяДата(),"ДЛФ=DT") + ": " + ТекстОшибки);						
						КонецЕсли;
						СообщениеОбОшибкеПриВыполненииКодаДляЗапретаВыводаСтрок = Истина;
					КонецПопытки;
				КонецЕсли;
				
				//Условия вывода строк, установленные пользователем
				Если Не УсловияВыводаСтрокиВыполнены Или УсловияЗапретаВыводаСтрокиВыполнены Тогда					
					
					Результат.Удалить(СтрокаТР);
					ЧислоУдаленныхСтрокТаблицыРасхождений = ЧислоУдаленныхСтрокТаблицыРасхождений + 1;
					Продолжить;
					
				КонецЕсли;
				
				Для СчетчикРеквизитов = 1 По ЧислоРеквизитов Цикл
					
					ИмяРеквизита = "РеквизитА" + СчетчикРеквизитов;
					Если ИтогиПоРеквизитамСоответствие[ИмяРеквизита].РассчитыватьИтог И ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ОшибкаПриВычислении = Ложь Тогда
						Попытка
							пЗначениеРеквизита = СтрокаТР[ИмяРеквизита];
							Если ЗначениеЗаполнено(пЗначениеРеквизита) Тогда
								пТипЗначения = ТипЗнч(пЗначениеРеквизита);
								//Количество
								Если ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Количество" Тогда
									ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений + 1;
								ИначеЕсли пТипЗначения = Тип("Число") Или пТипЗначения = Тип("Строка") Тогда
									пЗначениеРеквизитаЧисло = Число(пЗначениеРеквизита);																		
									//Сумма
									Если ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Сумма" Тогда
										ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений + пЗначениеРеквизитаЧисло;
									//Среднее
									ИначеЕсли ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Среднее" Тогда
										ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений + пЗначениеРеквизитаЧисло;
										ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений + 1;
									//Максимум
									ИначеЕсли ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Максимум" Тогда
										ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога = ?(ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога <> Неопределено, Макс(ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога, пЗначениеРеквизитаЧисло), пЗначениеРеквизитаЧисло);
									//Минимум
									ИначеЕсли ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Минимум" Тогда
										ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога = ?(ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога <> Неопределено, Мин(ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога, пЗначениеРеквизитаЧисло), пЗначениеРеквизитаЧисло);
									КонецЕсли;
								Иначе
									ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ОшибкаПриВычислении = Истина;
								КонецЕсли;
							КонецЕсли;
						Исключение
							ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ОшибкаПриВычислении = Истина;
						КонецПопытки;
					КонецЕсли;
					
					ИмяРеквизита = "РеквизитБ" + СчетчикРеквизитов;
					Если ИтогиПоРеквизитамСоответствие[ИмяРеквизита].РассчитыватьИтог И ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ОшибкаПриВычислении = Ложь Тогда
						Попытка
							пЗначениеРеквизита = СтрокаТР[ИмяРеквизита];
							Если ЗначениеЗаполнено(пЗначениеРеквизита) Тогда
								пТипЗначения = ТипЗнч(пЗначениеРеквизита);
								//Количество
								Если ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Количество" Тогда
									ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений + 1;
								ИначеЕсли пТипЗначения = Тип("Число") Или пТипЗначения = Тип("Строка") Тогда
									пЗначениеРеквизитаЧисло = Число(пЗначениеРеквизита);																		
									//Сумма
									Если ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Сумма" Тогда
										ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений + пЗначениеРеквизитаЧисло;
									//Среднее
									ИначеЕсли ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Среднее" Тогда
										ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений + пЗначениеРеквизитаЧисло;
										ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений + 1;
									//Максимум
									ИначеЕсли ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Максимум" Тогда
										ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога = ?(ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога <> Неопределено, Макс(ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога, пЗначениеРеквизитаЧисло), пЗначениеРеквизитаЧисло);
									//Минимум
									ИначеЕсли ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Минимум" Тогда
										ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога = ?(ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога <> Неопределено, Мин(ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога, пЗначениеРеквизитаЧисло), пЗначениеРеквизитаЧисло);
									КонецЕсли;
								Иначе
									ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ОшибкаПриВычислении = Истина;
								КонецЕсли;
							КонецЕсли;
						Исключение
							ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ОшибкаПриВычислении = Истина;
						КонецПопытки;
					КонецЕсли;
					
				КонецЦикла;
				
			Иначе
				
				СообщениеОНаличииНесколькихСтрокПоОдномуКлючу = Истина;
				
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЕсли;
	
#КонецОбласти 


#Область _3_4_5_7
	
	Если РеляционнаяОперация = 3 Или РеляционнаяОперация = 4 Или РеляционнаяОперация = 5 Или РеляционнаяОперация = 7 Тогда
			
		Для Каждого СтрокаТЗ_Б_Сгруппированная Из ТЗ_Б_Сгруппированная Цикл 		
			
			Ключ1 = СтрокаТЗ_Б_Сгруппированная[ИмяКлючаБ1];
			
			Если ЧислоСтолбцовВКлюче > 1 Тогда
				Ключ2 = СтрокаТЗ_Б_Сгруппированная[ИмяКлючаБ2];				
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
				Ключ3 = СтрокаТЗ_Б_Сгруппированная[ИмяКлючаБ3];
			КонецЕсли;

			Если ПодключениеА = Неопределено Тогда
				ОтборСтруктура = Новый Структура;
			Иначе
				ОтборСтруктура = ПодключениеА.NewObject("Структура");
			КонецЕсли;
			ОтборСтруктура.Вставить(ИмяКлючаА1, Ключ1);
			Если ЧислоСтолбцовВКлюче > 1 Тогда
				ОтборСтруктура.Вставить(ИмяКлючаА2, Ключ2);
			КонецЕсли;
			Если ЧислоСтолбцовВКлюче > 2 Тогда
				ОтборСтруктура.Вставить(ИмяКлючаА3, Ключ3);
			КонецЕсли;
			
			НайденныеСтроки = ТЗ_А_Сгруппированная.FindRows(ОтборСтруктура);
			СтрокаТЗ_А_Сгруппированная = ?(НайденныеСтроки.Count() > 0, НайденныеСтроки.Get(0), Неопределено);
						
			//Все пересечения обработаны в предыдущей секции
			Если СтрокаТЗ_А_Сгруппированная <> Неопределено Тогда
				Продолжить;
			КонецЕсли;
			
			СтрокаТР = Результат.Добавить();
			
			СтрокаТР.Ключ1 = Ключ1;
			Если ОтображатьТипыСтолбцовКлюча Тогда
				СтрокаТР.ТипСтолбца1Ключа = ТипЗнч(СтрокаТР.Ключ1);
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 1 Тогда
				СтрокаТР.Ключ2 = Ключ2;
				Если ОтображатьТипыСтолбцовКлюча Тогда
					СтрокаТР.ТипСтолбца2Ключа = ТипЗнч(СтрокаТР.Ключ2);
				КонецЕсли;
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
				СтрокаТР.Ключ3 = Ключ3;
				Если ОтображатьТипыСтолбцовКлюча Тогда
					СтрокаТР.ТипСтолбца3Ключа = ТипЗнч(СтрокаТР.Ключ3);
				КонецЕсли;
			КонецЕсли;
			
			СтрокаТР.ЧислоЗаписейБ = СтрокаТЗ_Б_Сгруппированная[ИмяКолонкиКоличествоСтрокИсточникаДанных];
			
			Если ЧислоКолонокТЗ_Б > 1 Тогда
				      							
				Если ПодключениеБ = Неопределено Тогда
					ОтборСтруктура = Новый Структура;
				Иначе
					ОтборСтруктура = ПодключениеБ.NewObject("Структура");
				КонецЕсли;
				ОтборСтруктура.Вставить(ИмяКлючаБ1, Ключ1);
				Если ЧислоСтолбцовВКлюче > 1 Тогда
					ОтборСтруктура.Вставить(ИмяКлючаБ2, Ключ2);
				КонецЕсли;
				Если ЧислоСтолбцовВКлюче > 2 Тогда
					ОтборСтруктура.Вставить(ИмяКлючаБ3, Ключ3);
				КонецЕсли;
				
				НайденныеСтроки = ТЗ_Б.FindRows(ОтборСтруктура);
				СтрокаТЗ_Б = ?(НайденныеСтроки.Count() > 0, НайденныеСтроки.Get(0), Неопределено);
			
				Если СтрокаТЗ_Б <> Неопределено Тогда
					
					//Значения реквизитов выводятся только при наличии единственной записи по ключу
					Если СтрокаТР.ЧислоЗаписейБ = 1 Тогда
						Для СчетчикКолонокБ = 1 По Мин(ЧислоРеквизитов, ЧислоКолонокТЗ_Б - ЧислоСтолбцовВключе) Цикл
							СтрокаТР["РеквизитБ" + СчетчикКолонокБ] = СтрокаТЗ_Б.Get(СчетчикКолонокБ + СмещениеНомераРеквизита);
						КонецЦикла;
					КонецЕсли;
					
				КонецЕсли;
				
			КонецЕсли;
			
			//Если число строк с одним ключом больше 1, результирующую строку нужно вывести обязательно, 
			//т.к. условия в данном случае некорректно применять вообще
			Если СтрокаТР.ЧислоЗаписейА <= 1 И СтрокаТР.ЧислоЗаписейБ <= 1 Тогда
				
				УсловияВыводаСтрокиВыполнены = Истина;
				
				Если Не УсловияВыводаСтрокОтключены Тогда
					Попытка
						Выполнить КодДляВыводаСтрок; 
					Исключение
						Если Не СообщениеОбОшибкеПриВыполненииКодаДляВыводаСтрок Тогда
							ТекстОшибки = ОписаниеОшибки();
							Сообщить(Формат(ТекущаяДата(),"ДЛФ=DT") + ": " + ТекстОшибки);						
						КонецЕсли;
						СообщениеОбОшибкеПриВыполненииКодаДляВыводаСтрок = Истина;
					КонецПопытки;
				КонецЕсли;
				
				УсловияЗапретаВыводаСтрокиВыполнены = Ложь;
				
				Если Не УсловияЗапретаВыводаСтрокОтключены Тогда
					Попытка
						Выполнить КодДляЗапретаВыводаСтрок; 
					Исключение
						Если Не СообщениеОбОшибкеПриВыполненииКодаДляЗапретаВыводаСтрок Тогда
							ТекстОшибки = ОписаниеОшибки();
							Сообщить(Формат(ТекущаяДата(),"ДЛФ=DT") + ": " + ТекстОшибки);
						КонецЕсли;
						СообщениеОбОшибкеПриВыполненииКодаДляЗапретаВыводаСтрок = Истина;
					КонецПопытки;
				КонецЕсли;
				
				//Условия вывода строк, установленные пользователем
				Если Не УсловияВыводаСтрокиВыполнены Или УсловияЗапретаВыводаСтрокиВыполнены Тогда					
					
					Результат.Удалить(СтрокаТР);
					ЧислоУдаленныхСтрокТаблицыРасхождений = ЧислоУдаленныхСтрокТаблицыРасхождений + 1;
					Продолжить;
					
				КонецЕсли;
				
				Для СчетчикРеквизитов = 1 По ЧислоРеквизитов Цикл
															
					ИмяРеквизита = "РеквизитБ" + СчетчикРеквизитов;
					Если ИтогиПоРеквизитамСоответствие[ИмяРеквизита].РассчитыватьИтог И ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ОшибкаПриВычислении = Ложь Тогда
						Попытка
							пЗначениеРеквизита = СтрокаТР[ИмяРеквизита];
							Если ЗначениеЗаполнено(пЗначениеРеквизита) Тогда
								пТипЗначения = ТипЗнч(пЗначениеРеквизита);
								//Количество
								Если ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Количество" Тогда
									ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений + 1;
								ИначеЕсли пТипЗначения = Тип("Число") Или пТипЗначения = Тип("Строка") Тогда
									пЗначениеРеквизитаЧисло = Число(пЗначениеРеквизита);																		
									//Сумма
									Если ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Сумма" Тогда
										ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений + пЗначениеРеквизитаЧисло;
									//Среднее
									ИначеЕсли ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Среднее" Тогда
										ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений + пЗначениеРеквизитаЧисло;
										ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений + 1;
									//Максимум
									ИначеЕсли ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Максимум" Тогда
										ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога = ?(ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога <> Неопределено, Макс(ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога, пЗначениеРеквизитаЧисло), пЗначениеРеквизитаЧисло);
									//Минимум
									ИначеЕсли ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Минимум" Тогда
										ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога = ?(ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога <> Неопределено, Мин(ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога, пЗначениеРеквизитаЧисло), пЗначениеРеквизитаЧисло);
									КонецЕсли;
								Иначе
									ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ОшибкаПриВычислении = Истина;
								КонецЕсли;
							КонецЕсли;
						Исключение
							ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ОшибкаПриВычислении = Истина;
						КонецПопытки;
					КонецЕсли;
					
				КонецЦикла;
				
			Иначе
				
				СообщениеОНаличииНесколькихСтрокПоОдномуКлючу = Истина;
				
			КонецЕсли;
			
		КонецЦикла;

	КонецЕсли;
	
#КонецОбласти 

	Для СчетчикРеквизитов = 1 По ЧислоРеквизитов Цикл
					
		ИмяРеквизита = "РеквизитА" + СчетчикРеквизитов;
		Если ИтогиПоРеквизитамСоответствие[ИмяРеквизита].РассчитыватьИтог Тогда
			Если ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ОшибкаПриВычислении Тогда
				ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога = "Ошибка";
			Иначе
				//Сумма
				Если ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Сумма" Тогда
					ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений;
				//Среднее
				ИначеЕсли ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Среднее" Тогда
					ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога = ?(ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений <> 0, ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений / ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений, 0);
				//Количество
				ИначеЕсли ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Количество" Тогда
					ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений;
				КонецЕсли;
			КонецЕсли;
		
			ЭтотОбъект["ЗначениеИтога" + ИмяРеквизита] = "А" + СчетчикРеквизитов + ": " + ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога;
		
		Иначе
			ЭтотОбъект["ЗначениеИтога" + ИмяРеквизита] = "";
		КонецЕсли;
		
		ИмяРеквизита = "РеквизитБ" + СчетчикРеквизитов;
		Если ИтогиПоРеквизитамСоответствие[ИмяРеквизита].РассчитыватьИтог Тогда
			Если ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ОшибкаПриВычислении Тогда
				ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога = "Ошибка";
			Иначе
				//Сумма
				Если ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Сумма" Тогда
					ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений;
				//Среднее
				ИначеЕсли ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Среднее" Тогда
					ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога = ?(ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений <> 0, ИтогиПоРеквизитамСоответствие[ИмяРеквизита].СуммаЗначений / ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений, 0);
					//Количество
				ИначеЕсли ИтогиПоРеквизитамСоответствие[ИмяРеквизита].АгрегатнаяФункцияРасчетаИтога = "Количество" Тогда
					ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога = ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЧислоЗначений;
				КонецЕсли;
			КонецЕсли;
			
			ЭтотОбъект["ЗначениеИтога" + ИмяРеквизита] = "Б" + СчетчикРеквизитов + ": " + ИтогиПоРеквизитамСоответствие[ИмяРеквизита].ЗначениеИтога;
			
		Иначе
			ЭтотОбъект["ЗначениеИтога" + ИмяРеквизита] = "";
		КонецЕсли;
		
	КонецЦикла;

	Если СортироватьТаблицуРасхождений Тогда
		Результат.Сортировать(ПорядокСортировкиТаблицыРасхождений);
	КонецЕсли;
	
	Если СообщениеОНаличииНесколькихСтрокПоОдномуКлючу Тогда
		Сообщить(Формат(ТекущаяДата(),"ДЛФ=DT") + ": Обнаружены дубликаты (подсвечены красным цветом), настройки отбора на них не распространяются. Просмотреть дублирующиеся строки можно на форме предварительного просмотра.");
	КонецЕсли;
	
	ТекстСообщения = СтрШаблон("Число записей, удаленных из таблицы расхождений в соответствии с условиями вывода и запрета вывода: %1", ЧислоУдаленныхСтрокТаблицыРасхождений);
	Сообщить(Формат(ТекущаяДата(),"ДЛФ=DT") + ": " + ТекстСообщения);
		
КонецПроцедуры

Функция ПрочитатьДанныеИПолучитьТЗ(ИдентификаторБазы, ТекстОшибки = "", Подключение = Неопределено) Экспорт
	
	//Текущая или внешняя база 1С 8
	Если ЭтотОбъект["ТипБазы" + ИдентификаторБазы] = 0 Или ЭтотОбъект["ТипБазы" + ИдентификаторБазы] = 1 Тогда
		 ТЗ = ВыполнитьЗапрос1С8ИПолучитьТЗ(ИдентификаторБазы, ТекстОшибки, Подключение);
	//SQL
	ИначеЕсли ЭтотОбъект["ТипБазы" + ИдентификаторБазы] = 2 Тогда		
		ТЗ = ВыполнитьЗапросSQLИПолучитьТЗ(ИдентификаторБазы, ТекстОшибки);
	//Файл
	ИначеЕсли ЭтотОбъект["ТипБазы" + ИдентификаторБазы] = 3 Тогда
		ТЗ = ПрочитатьДанныеИзФайлаИПолучитьТЗ(ИдентификаторБазы, ТекстОшибки);
	//Таблица
	ИначеЕсли ЭтотОбъект["ТипБазы" + ИдентификаторБазы] = 4 Тогда		
		ТЗ = ПолучитьДанныеИзТабличногоДокумента(ИдентификаторБазы, ТекстОшибки);
	//Внешняя база 1С 7.7
	ИначеЕсли ЭтотОбъект["ТипБазы" + ИдентификаторБазы] = 5 Тогда		
		ТЗ = ВыполнитьЗапрос1С77ИПолучитьТЗ(ИдентификаторБазы, ТекстОшибки);
	//JSON
	ИначеЕсли ЭтотОбъект["ТипБазы" + ИдентификаторБазы] = 6 Тогда		
		ТЗ = ПрочитатьДанныеИзJSONИПолучитьТЗ(ИдентификаторБазы, ТекстОшибки);
	Иначе
		ТекстОшибки = "Тип базы " + ИдентификаторБазы + " '" + ЭтотОбъект["ТипБазы" + ИдентификаторБазы] + "' не предусмотрен";
		Сообщить(Формат(ТекущаяДата(),"ДЛФ=DT") + ": " + ТекстОшибки);
		ТЗ = Неопределено;
	КонецЕсли;
	
	Если ЭтотОбъект["ТипБазы" + ИдентификаторБазы] >= 3 И ЭтотОбъект["СворачиватьТаблицу" + ИдентификаторБазы] Тогда
		СтолбцыКлюча = "Ключ1";
		Если ЧислоСтолбцовВКлюче > 1 Тогда
			СтолбцыКлюча = СтолбцыКлюча + ",Ключ2";
		КонецЕсли;
		Если ЧислоСтолбцовВКлюче > 2 Тогда
			СтолбцыКлюча = СтолбцыКлюча + ",Ключ3";
		КонецЕсли;
		ТЗ.Свернуть(СтолбцыКлюча,"Реквизит1,Реквизит2,Реквизит3,Реквизит4,Реквизит5");
	КонецЕсли;
	
	Возврат ТЗ;
	
КонецФункции

Функция ВыполнитьЗапрос1С8ИПолучитьТЗ(ИдентификаторБазы, ТекстОшибок = "", Подключение = Неопределено)
	
	//Текущая
	Если ЭтотОбъект["ТипБазы" + ИдентификаторБазы] = 0 Тогда
		
		Запрос = Новый Запрос;
		Запрос.Текст = ЭтотОбъект["ТекстЗапроса" + ИдентификаторБазы];
		
		УстановитьПараметры(Запрос, ИдентификаторБазы); 
		
	//Внешняя
	ИначеЕсли ЭтотОбъект["ТипБазы" + ИдентификаторБазы] = 1 Тогда
		
		Если ЭтотОбъект["ВариантРаботыВнешнейБазы" + ИдентификаторБазы] = 0 Тогда
			ПараметрСоединения = 
				"File=""" + ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "ПутьКБазе"]
				+ """;Usr=""" + ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Логин"]
				+ """;Pwd=""" + ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Пароль"] + """;";	
		Иначе
			ПараметрСоединения = 
				"Srvr=""" + ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Сервер"]
				+ """;Ref=""" + ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "ПутьКБазе"] 
				+ """;Usr=""" + ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Логин"] 
				+ """;Pwd=""" + ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Пароль"] + """;";
		КонецЕсли;
				
		Попытка
			COMConnector = Новый COMОбъект(ЭтотОбъект["ВерсияПлатформыВнешнейБазы" + ИдентификаторБазы] + ".COMConnector");
			Подключение = COMConnector.Connect(ПараметрСоединения);
		Исключение
			ТекстОшибки = ОписаниеОшибки();
			ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			Возврат Неопределено;
		КонецПопытки;

		Запрос = Подключение.NewObject("Запрос");
		Запрос.Текст = ЭтотОбъект["ТекстЗапроса" + ИдентификаторБазы];
		
		УстановитьПараметры(Запрос, ИдентификаторБазы); 
	
	КонецЕсли;
	
	Запрос.УстановитьПараметр("ДатаНачала", 	ЗначениеАбсолютногоПериода.ДатаНачала);
	Запрос.УстановитьПараметр("ДатаОкончания", 	ЗначениеАбсолютногоПериода.ДатаОкончания);
	
	Попытка
		ТЗ = Запрос.Выполнить().Выгрузить();
	Исключение
		ТекстОшибки = ОписаниеОшибки();
		ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
		ТЗ = Неопределено;
	КонецПопытки;
	
	Если ТЗ <> Неопределено Тогда
				
		ЧислоКолонокВТЗ = ТЗ.Колонки.Count();
		Если ЧислоСтолбцовВКлюче > ЧислоКолонокВТЗ Тогда
			ТекстОшибки = "Выборка из источника " + ИдентификаторБазы + " содержит " + ЧислоКолонокВТЗ + " колонок, проверьте корректность заданного числа столбцов в ключе";
			СообщениеПользователю = Новый СообщениеПользователю;
			СообщениеПользователю.Текст = ТекстОшибки;
			СообщениеПользователю.Поле = "Объект.ЧислоСтолбцовВКлюче";
			СообщениеПользователю.Сообщить();
			ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			Возврат Неопределено;
		КонецЕсли;
		    
		Для СчетчикРеквизитов = 1 По Мин(ЧислоКолонокВТЗ - ЧислоСтолбцовВКлюче, ЧислоРеквизитов) Цикл //
			
			Если ЭтотОбъект["НастройкиФайла" + ИдентификаторБазы].Количество() >= СчетчикРеквизитов Тогда
				ЗаголовокРеквизитаИзНастроек = ЭтотОбъект["НастройкиФайла" + ИдентификаторБазы][СчетчикРеквизитов - 1].ЗаголовокРеквизитаДляПользователя;
			Иначе
				ЗаголовокРеквизитаИзНастроек = "";
			КонецЕсли;
			
			ИмяРеквизита = Строка(ИдентификаторБазы) + СчетчикРеквизитов;
			ПредставленияЗаголовковРеквизитов[ИмяРеквизита] = ИмяРеквизита + ": " + ?(ПустаяСтрока(ЗаголовокРеквизитаИзНастроек), ТЗ.Колонки.Get(СчетчикРеквизитов + ЧислоСтолбцовВКлюче - 1).Title, ЗаголовокРеквизитаИзНастроек);
		
		КонецЦикла; 
		
		Если (ЭтотОбъект["ИспользоватьВКачествеКлючаУникальныйИдентификатор" + ИдентификаторБазы]
			Или ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] 
			Или ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] 
			Или ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы]
			Или ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча1" + ИдентификаторБазы])
			Или ЧислоСтолбцовВКлюче > 1 И 
			(ЭтотОбъект["ИспользоватьВКачествеКлюча2УникальныйИдентификатор" + ИдентификаторБазы] 
			Или ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] 
			Или ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] 
			Или ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы]
			Или ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча2" + ИдентификаторБазы])
			Или ЧислоСтолбцовВКлюче > 2 И 
			(ЭтотОбъект["ИспользоватьВКачествеКлюча3УникальныйИдентификатор" + ИдентификаторБазы] 
			Или ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] 
			Или ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] 
			Или ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы]
			Или ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча3" + ИдентификаторБазы])Тогда
			
			ИмяПервойКолонки = ТЗ.Колонки.Get(0).Name;
			ИмяКолонкиКлюч1	= ИмяПервойКолонки;
			НомерКолонкиКлюч1 = 0;
			НомерКолонкиКлюч2 = 1;
			НомерКолонкиКлюч3 = 2;
			
			Если ЧислоСтолбцовВКлюче > 1 Тогда
				ИмяВторойКолонки = ТЗ.Колонки.Get(1).Name;
				ИмяКолонкиКлюч2 = ИмяВторойКолонки;
			Иначе
				ИмяВторойКолонки = "";
				ИмяКолонкиКлюч2 = "";
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
				ИмяТретьейКолонки = ТЗ.Колонки.Get(2).Name;
				ИмяКолонкиКлюч3 = ИмяТретьейКолонки;
			Иначе
				ИмяТретьейКолонки = "";
				ИмяКолонкиКлюч3 = "";
			КонецЕсли;
			
			Если ЭтотОбъект["ИспользоватьВКачествеКлючаУникальныйИдентификатор" + ИдентификаторБазы]
				Или ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы] 
				Или ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] 
				Или ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
				
				ИмяКолонкиКлюч1 = "Ключ1" + Формат(ТекущаяДата(), "ДФ=ddMMyyyyHHmmss");
				ТЗ.Колонки.Вставить(НомерКолонкиКлюч1, ИмяКолонкиКлюч1);
				НомерКолонкиКлюч2 = НомерКолонкиКлюч2 + 1;
				НомерКолонкиКлюч3 = НомерКолонкиКлюч3 + 1;

			КонецЕсли;
		
			Если ЧислоСтолбцовВКлюче > 1 Тогда
			
				Если ЭтотОбъект["ИспользоватьВКачествеКлюча2УникальныйИдентификатор" + ИдентификаторБазы]
					Или ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы] 
					Или ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] 
					Или ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
					
					ИмяКолонкиКлюч2 = "Ключ2" + Формат(ТекущаяДата(), "ДФ=ddMMyyyyHHmmss");
					ТЗ.Колонки.Вставить(НомерКолонкиКлюч2, ИмяКолонкиКлюч2);
					НомерКолонкиКлюч3 = НомерКолонкиКлюч3 + 1;
					
				КонецЕсли;
				
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
			
				Если ЭтотОбъект["ИспользоватьВКачествеКлюча3УникальныйИдентификатор" + ИдентификаторБазы]
					Или ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы] 
					Или ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] 
					Или ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
					
					ИмяКолонкиКлюч3 = "Ключ3" + Формат(ТекущаяДата(), "ДФ=ddMMyyyyHHmmss");
					ТЗ.Колонки.Вставить(НомерКолонкиКлюч3, ИмяКолонкиКлюч3);
					
				КонецЕсли;
				
			КонецЕсли;
			
			//Индексирование
			КолонкиСКлючомСтрокой = ИмяКолонкиКлюч1;
			Если ЧислоСтолбцовВКлюче > 1 Тогда
				КолонкиСКлючомСтрокой = КолонкиСКлючомСтрокой + "," + ИмяКолонкиКлюч2;
			КонецЕсли;
			Если ЧислоСтолбцовВКлюче > 2 Тогда
				КолонкиСКлючомСтрокой = КолонкиСКлючомСтрокой + "," + ИмяКолонкиКлюч3;
			КонецЕсли;

			ТЗ.Индексы.Добавить(КолонкиСКлючомСтрокой);
			       						
			СчетчикСтрок = 0;
			Для Каждого СтрокаТЗ Из ТЗ Цикл
				
				СчетчикСтрок = СчетчикСтрок + 1;
								
				Попытка
					
					Если ЭтотОбъект["ИспользоватьВКачествеКлючаУникальныйИдентификатор" + ИдентификаторБазы] Тогда
						Если ЭтотОбъект["ТипБазы" + ИдентификаторБазы] = 0 Тогда
							СтрокаТЗ[ИмяКолонкиКлюч1] = СокрЛП(XMLСтрока(СтрокаТЗ[ИмяПервойКолонки]));
						Иначе
							СтрокаТЗ[ИмяКолонкиКлюч1] = СокрЛП(Подключение.XMLСтрока(СтрокаТЗ[ИмяПервойКолонки]));
						КонецЕсли;
					ИначеЕсли ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы]
						Или ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы]
						Или ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
						СтрокаТЗ[ИмяКолонкиКлюч1] = СокрЛП(Строка(СтрокаТЗ[ИмяПервойКолонки]));
					КонецЕсли;
					
					Если ЭтотОбъект["ДлинаКлючаПриПриведенииКСтроке" + ИдентификаторБазы] > 0 Тогда
						СтрокаТЗ[ИмяКолонкиКлюч1] = СокрЛП(Лев(СтрокаТЗ[ИмяКолонкиКлюч1], ЭтотОбъект["ДлинаКлючаПриПриведенииКСтроке" + ИдентификаторБазы]));
					КонецЕсли;
						
					Если ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] Тогда
						СтрокаТЗ[ИмяКолонкиКлюч1] = СокрЛП(ВРег(Строка(СтрокаТЗ[ИмяКолонкиКлюч1])));
					КонецЕсли;
					
					Если ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
						СтрокаТЗ[ИмяКолонкиКлюч1] = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(СтрокаТЗ[ИмяКолонкиКлюч1]), "{", ""), "}", ""));
					КонецЕсли;
					
				Исключение
					
					ТекстОшибки = "Ошибка при обработке ключа в строке " + СчетчикСтрок + " выборки из базы " + ИдентификаторБазы + ": " + ОписаниеОшибки();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					
				КонецПопытки;
				
				Если ЧислоСтолбцовВКлюче > 1 Тогда
						
					Попытка
						
						Если ЭтотОбъект["ИспользоватьВКачествеКлюча2УникальныйИдентификатор" + ИдентификаторБазы] Тогда
							Если ЭтотОбъект["ТипБазы" + ИдентификаторБазы] = 0 Тогда
								СтрокаТЗ[ИмяКолонкиКлюч2] = СокрЛП(XMLСтрока(СтрокаТЗ[ИмяВторойКолонки]));
							Иначе
								СтрокаТЗ[ИмяКолонкиКлюч2] = СокрЛП(Подключение.XMLСтрока(СтрокаТЗ[ИмяВторойКолонки]));
							КонецЕсли;
						ИначеЕсли ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы]
							Или ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы]
							Или ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
							СтрокаТЗ[ИмяКолонкиКлюч2] = СокрЛП(Строка(СтрокаТЗ[ИмяВторойКолонки]));
						КонецЕсли;

						
						Если ЭтотОбъект["ДлинаКлюча2ПриПриведенииКСтроке" + ИдентификаторБазы] > 0 Тогда
							СтрокаТЗ[ИмяКолонкиКлюч2] = СокрЛП(Лев(СтрокаТЗ[ИмяКолонкиКлюч2], ЭтотОбъект["ДлинаКлючаПриПриведенииКСтроке" + ИдентификаторБазы]));
						КонецЕсли;
						
						Если ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] Тогда
							СтрокаТЗ[ИмяКолонкиКлюч2] = СокрЛП(ВРег(Строка(СтрокаТЗ[ИмяКолонкиКлюч2])));
						КонецЕсли;
						
						Если ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
							СтрокаТЗ[ИмяКолонкиКлюч2] = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(СтрокаТЗ[ИмяКолонкиКлюч2]), "{", ""), "}", ""));
						КонецЕсли;
						
					Исключение
						
						ТекстОшибки = "Ошибка при обработке столбца 2 ключа в строке " + СчетчикСтрок + " выборки из базы " + ИдентификаторБазы + ": " + ОписаниеОшибки();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
						
					КонецПопытки;
					
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда
						
					Попытка
						
						Если ЭтотОбъект["ИспользоватьВКачествеКлюча3УникальныйИдентификатор" + ИдентификаторБазы] Тогда
							Если ЭтотОбъект["ТипБазы" + ИдентификаторБазы] = 0 Тогда
								СтрокаТЗ[ИмяКолонкиКлюч3] = СокрЛП(XMLСтрока(СтрокаТЗ[ИмяТретьейКолонки]));
							Иначе
								СтрокаТЗ[ИмяКолонкиКлюч3] = СокрЛП(Подключение.XMLСтрока(СтрокаТЗ[ИмяТретьейКолонки]));
							КонецЕсли;
						ИначеЕсли ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы]
							Или ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы]
							Или ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
							СтрокаТЗ[ИмяКолонкиКлюч3] = СокрЛП(Строка(СтрокаТЗ[ИмяТретьейКолонки]));
						КонецЕсли;
						
						Если ЭтотОбъект["ДлинаКлюча3ПриПриведенииКСтроке" + ИдентификаторБазы] > 0 Тогда
							СтрокаТЗ[ИмяКолонкиКлюч3] = СокрЛП(Лев(СтрокаТЗ[ИмяКолонкиКлюч3], ЭтотОбъект["ДлинаКлючаПриПриведенииКСтроке" + ИдентификаторБазы]));
						КонецЕсли;
						
						Если ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] Тогда
							СтрокаТЗ[ИмяКолонкиКлюч3] = СокрЛП(ВРег(Строка(СтрокаТЗ[ИмяКолонкиКлюч3])));
						КонецЕсли;
						
						Если ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
							СтрокаТЗ[ИмяКолонкиКлюч3] = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(СтрокаТЗ[ИмяКолонкиКлюч3]), "{", ""), "}", ""));
						КонецЕсли;
						
					Исключение
						
						ТекстОшибки = "Ошибка при обработке столбца 3 ключа в строке " + СчетчикСтрок + " выборки из базы " + ИдентификаторБазы + ": " + ОписаниеОшибки();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
						
					КонецПопытки;
					
				КонецЕсли;
						
#Область Произвольный_код_обработки_ключа

				КлючТек = СтрокаТЗ[ИмяКолонкиКлюч1];
				Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча1" + ИдентификаторБазы] Тогда
					Попытка
					    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча1" + ИдентификаторБазы];
					Исключение
						ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 1: """ + КлючТек + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
						Сообщить(ТекстОшибки);
					КонецПопытки;
				КонецЕсли;
				СтрокаТЗ[ИмяКолонкиКлюч1] = КлючТек;
				
				Если ЧислоСтолбцовВКлюче > 1 Тогда
					КлючТек = СтрокаТЗ[ИмяКолонкиКлюч2];
					Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча2" + ИдентификаторБазы] Тогда
						Попытка
						    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча2" + ИдентификаторБазы];
						Исключение
							ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 2: """ + КлючТек + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
							Сообщить(ТекстОшибки);
						КонецПопытки;
					КонецЕсли;
					СтрокаТЗ[ИмяКолонкиКлюч2] = КлючТек;
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда
					КлючТек = СтрокаТЗ[ИмяКолонкиКлюч3];
					Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча3" + ИдентификаторБазы] Тогда
						Попытка
						    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча3" + ИдентификаторБазы];
						Исключение
							ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 3: """ + КлючТек + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
							Сообщить(ТекстОшибки);
						КонецПопытки;
					КонецЕсли;
					СтрокаТЗ[ИмяКолонкиКлюч3] = КлючТек;
				КонецЕсли;
	
#КонецОбласти
				
			КонецЦикла;
			
			Если ЭтотОбъект["ИспользоватьВКачествеКлючаУникальныйИдентификатор" + ИдентификаторБазы] 
				Или ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы] 
				Или ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] 
				Или ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
			
				ТЗ.Колонки.Удалить(ИмяПервойКолонки);
			
			КонецЕсли;
		
			Если ЧислоСтолбцовВКлюче > 1 Тогда
								
				Если ЭтотОбъект["ИспользоватьВКачествеКлюча2УникальныйИдентификатор" + ИдентификаторБазы] 
					Или ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы] 
					Или ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] 
					Или ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
					
					ТЗ.Колонки.Удалить(ИмяВторойКолонки);
					
				КонецЕсли;
				
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
								
				Если ЭтотОбъект["ИспользоватьВКачествеКлюча3УникальныйИдентификатор" + ИдентификаторБазы] 
					Или ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы] 
					Или ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] 
					Или ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
					
					ТЗ.Колонки.Удалить(ИмяТретьейКолонки);
					
				КонецЕсли;
				
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат ТЗ;
	
КонецФункции

Функция ВыполнитьЗапрос1С77ИПолучитьТЗ(ИдентификаторБазы, ТекстОшибок = "", Подключение = Неопределено)
	
	ПутьКБазе = ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "ПутьКБазе"];
	Пользователь = ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Логин"];
	Пароль = ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Пароль"];
		
	Подключение = Новый COMОбъект("V1CEnterprise.Application");
    
    Попытка   
		
		СтрокаПодключения = "/D"""+СокрЛП(ПутьКБазе)+""" /N"""+СокрЛП(Пользователь)+""" /P"""+СокрЛП(Пароль)+"""";
        ПодключениеУстановлено = Подключение.Initialize(Подключение.RMTrade,СтрокаПодключения,"NO_SPLASH_SHOW");
        
        Если ПодключениеУстановлено Тогда
            ЕстьПодключение = Истина;
        Иначе
            ТекстОшибки = "Ошибка при подключении к внешней базе";
			ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			Возврат Неопределено;
        КонецЕсли;    
    Исключение
        ТекстОшибки = "Ошибка при подключении к внешней базе: " + ОписаниеОшибки();
		ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
		Возврат Неопределено;
	КонецПопытки;
		
	Запрос = Подключение.CreateObject("Запрос");
	ТекстЗапроса = ЭтотОбъект["ТекстЗапроса" + ИдентификаторБазы];
	
	Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
		Возврат Неопределено;
	КонецЕсли;

	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Ключ1");
	Если ЧислоСтолбцовВКлюче > 1 Тогда
		ТЗ.Колонки.Добавить("Ключ2");
	КонецЕсли;
	Если ЧислоСтолбцовВКлюче > 2 Тогда
		ТЗ.Колонки.Добавить("Ключ3");
	КонецЕсли;
	ТЗ.Колонки.Добавить("Реквизит1");
	ТЗ.Колонки.Добавить("Реквизит2");
	ТЗ.Колонки.Добавить("Реквизит3");
	ТЗ.Колонки.Добавить("Реквизит4");
	ТЗ.Колонки.Добавить("Реквизит5");
	
	ТаблицаЗначений1С77 = Подключение.CreateObject("ТаблицаЗначений");
	Запрос.Выгрузить(ТаблицаЗначений1С77,1,0);	
	КоличествоСтрок = ТаблицаЗначений1С77.КоличествоСтрок();
	КоличествоКолонок = ТаблицаЗначений1С77.КоличествоКолонок();
	Для СчетчикСтрок = 1 По КоличествоСтрок Цикл
		
		СтрокаТЗ = ТЗ.Добавить();
			
		Ключ1 = ТаблицаЗначений1С77.ПолучитьЗначение(СчетчикСтрок, 1);
		
		Если ЧислоСтолбцовВКлюче > 1 Тогда
			Ключ2 = ТаблицаЗначений1С77.ПолучитьЗначение(СчетчикСтрок, 2);
		Иначе
			Ключ2 = "";				
		КонецЕсли;
		
		Если ЧислоСтолбцовВКлюче > 2 Тогда
			Ключ3 = ТаблицаЗначений1С77.ПолучитьЗначение(СчетчикСтрок, 3);
		Иначе
			Ключ3 = "";				
		КонецЕсли;
		
		Попытка
			
			Если ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы] Тогда
				Ключ1 = СокрЛП(Строка(Ключ1));
			КонецЕсли;
		
			Если ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] Тогда
				Ключ1 = СокрЛП(ВРег(Строка(Ключ1)));
			КонецЕсли;
			
			Если ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
				Ключ1 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ1), "{", ""), "}", ""));
			КонецЕсли;
			
		Исключение
			
			ТекстОшибки = "Ошибка при обработке ключа в строке " + СчетчикСтрок + " выборки из базы " + ИдентификаторБазы + ": " + ОписаниеОшибки();
			ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			
		КонецПопытки;
		
		Если ЧислоСтолбцовВКлюче > 1 Тогда
			
			Попытка
			
				Если ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы] Тогда
					Ключ2 = СокрЛП(Строка(Ключ2));
				КонецЕсли;
			
				Если ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] Тогда
					Ключ2 = СокрЛП(ВРег(Строка(Ключ2)));
				КонецЕсли;
				
				Если ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
					Ключ2 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ2), "{", ""), "}", ""));
				КонецЕсли;
			
			Исключение
				
				ТекстОшибки = "Ошибка при обработке столбца 2 ключа в строке " + СчетчикСтрок + " выборки из базы " + ИдентификаторБазы + ": " + ОписаниеОшибки();
				ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				
			КонецПопытки;
			
		КонецЕсли;
		
		Если ЧислоСтолбцовВКлюче > 2 Тогда
			
			Попытка
			
			Если ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы] Тогда
				Ключ3 = СокрЛП(Строка(Ключ3));
			КонецЕсли;
		
			Если ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] Тогда
				Ключ3 = СокрЛП(ВРег(Строка(Ключ3)));
			КонецЕсли;
			
			Если ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
				Ключ3 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ3), "{", ""), "}", ""));
			КонецЕсли;
			
			Исключение
				
				ТекстОшибки = "Ошибка при обработке столбца 3 ключа в строке " + СчетчикСтрок + " выборки из базы " + ИдентификаторБазы + ": " + ОписаниеОшибки();
				ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				
			КонецПопытки;
			
		КонецЕсли;
			          			
#Область Произвольный_код_обработки_ключа

			КлючТек = Ключ1;
			Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча1" + ИдентификаторБазы] Тогда
				Попытка
				    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча1" + ИдентификаторБазы];
				Исключение
					ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 1: """ + Ключ1 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
					Сообщить(ТекстОшибки);
				КонецПопытки;
			КонецЕсли;
			СтрокаТЗ.Ключ1 = КлючТек;
			
			Если ЧислоСтолбцовВКлюче > 1 Тогда
				КлючТек = Ключ2;				
				Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча2" + ИдентификаторБазы] Тогда
					Попытка
					    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча2" + ИдентификаторБазы];
					Исключение
						ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 2: """ + Ключ2 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
						Сообщить(ТекстОшибки);
					КонецПопытки;
				КонецЕсли;
				СтрокаТЗ.Ключ2 = КлючТек;
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
				КлючТек = Ключ3;
				Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча3" + ИдентификаторБазы] Тогда
					Попытка
					    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча3" + ИдентификаторБазы];
					Исключение
						ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 3: """ + Ключ3 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
						Сообщить(ТекстОшибки);
					КонецПопытки;
				КонецЕсли;
				СтрокаТЗ.Ключ3 = КлючТек;
			КонецЕсли;
			
#КонецОбласти 
			
		Для СчетчикКолонок = 1 По Мин(ЧислоРеквизитов, КоличествоКолонок - ЧислоСтолбцовВключе) Цикл    
			
			//ИмяКолонки = = ТаблицаЗначений1С77.ПолучитьПараметрыКолонки(СчетчикКолонок);
			ЗначениеЯчейки = ТаблицаЗначений1С77.ПолучитьЗначение(СчетчикСтрок, СчетчикКолонок + ЧислоСтолбцовВключе);
			СтрокаТЗ["Реквизит" + СчетчикКолонок] = ЗначениеЯчейки;
			
		КонецЦикла;
				
	КонецЦикла;
	
	Подключение.ЗавершитьРаботуСистемы(0);
	
	Подключение = Неопределено;
		
	//Запрос = СоздатьОбъект("Запрос");
	//ТекстЗапроса = 
	//"//{{ЗАПРОС(Сформировать)
	//|с ВыбНачПериода по ВыбКонПериода;
	//|Бренд = Справочник.Товары.Бренд;
	//|Товар = Справочник.Товары.Наименование;
	//|Остаток = Справочник.Товары.Остаток;
	//|Функция СуммаОстаток = Сумма(Остаток);
	//|Группировка Бренд;	
	//|"//}}ЗАПРОС
	//;
	// Если ошибка в запросе, то выход из процедуры
	//Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
	//	Возврат;
	//КонецЕсли;
	
	//ТаблицаЗначений1С77 = СоздатьОбъект("ТаблицаЗначений");
	//Запрос.Выгрузить(ТаблицаЗначений1С77,1,0);	
	//КоличествоСтрок = ТаблицаЗначений1С77.КоличествоСтрок();
	//КоличествоКолонок = ТаблицаЗначений1С77.КоличествоКолонок();
	//Для СчетчикСтрок = 1 По КоличествоСтрок Цикл
	//	ВсяСтрока = "";
	//	Для СчетчикКолонок = 1 По ТаблицаЗначений1С77.КоличествоКолонок() Цикл    
	//		//ИмяКолонки = = ТаблицаЗначений1С77.ПолучитьПараметрыКолонки(СчетчикКолонок);
	//		ЗначениеЯчейки = ТаблицаЗначений1С77.ПолучитьЗначение(СчетчикСтрок, СчетчикКолонок); 
	//		ВсяСтрока = ВсяСтрока + ", " + ЗначениеЯчейки;
	//	КонецЦикла;
	//	Сообщить(ВсяСтрока);
	//	
	//КонецЦикла
	
#Область Заполнение_ТЗ
	
	Если ТЗ <> Неопределено Тогда
		
		Если (ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] 
		Или ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] 
		Или ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы]
		Или ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча1" + ИдентификаторБазы])
		Или ЧислоСтолбцовВКлюче > 1 И 
		(ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] 
		Или ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] 
		Или ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы]
		Или ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча2" + ИдентификаторБазы])
		Или ЧислоСтолбцовВКлюче > 2 И 
		(ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] 
		Или ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] 
		Или ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы]
		Или ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча3" + ИдентификаторБазы])Тогда
		
			ИмяПервойКолонки = ТЗ.Колонки.Get(0).Name;
			
			Если ЧислоСтолбцовВКлюче > 1 Тогда
				ИмяВторойКолонки = ТЗ.Колонки.Get(1).Name;
			Иначе
				ИмяВторойКолонки = "";
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
				ИмяТретьейКолонки = ТЗ.Колонки.Get(2).Name;
			Иначе
				ИмяТретьейКолонки = "";
			КонецЕсли;
			
			ИмяКолонкиКлюч1 = ТЗ.Колонки.Get(0).Name;
			Если ЧислоСтолбцовВКлюче > 1 Тогда
				ИмяКолонкиКлюч2 = ТЗ.Колонки.Get(1).Name;
			Иначе
				ИмяКолонкиКлюч2 = "";
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
				ИмяКолонкиКлюч3 = ТЗ.Колонки.Get(2).Name;
			Иначе
				ИмяКолонкиКлюч3 = "";
			КонецЕсли;
			
			Если ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы] 
				Или ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] 
				Или ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
				
				ИмяКолонкиКлюч1 = "Ключ1" + Формат(ТекущаяДата(), "ДФ=ddMMyyyyHHmmss");
				ТЗ.Колонки.Вставить(0, ИмяКолонкиКлюч1);//, ОписаниеСтроки);

			КонецЕсли;
		
			Если ЧислоСтолбцовВКлюче > 1 Тогда
			
				Если ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы] 
					Или ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] 
					Или ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
					
					ИмяКолонкиКлюч2 = "Ключ2" + Формат(ТекущаяДата(), "ДФ=ddMMyyyyHHmmss");
					ТЗ.Колонки.Вставить(1, ИмяКолонкиКлюч2);
				КонецЕсли;
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
			
				Если ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы] 
					Или ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] 
					Или ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
					
					ИмяКолонкиКлюч3 = "Ключ3" + Формат(ТекущаяДата(), "ДФ=ddMMyyyyHHmmss");
					ТЗ.Колонки.Вставить(2, ИмяКолонкиКлюч3);
				КонецЕсли;
			КонецЕсли;
			       						
			СчетчикСтрок = 0;			
			Для Каждого СтрокаТЗ Из ТЗ Цикл
				
				СчетчикСтрок = СчетчикСтрок + 1;
				
				Попытка
					
					Если ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы]
						Или ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы]
						Или ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
						СтрокаТЗ[ИмяКолонкиКлюч1] = СокрЛП(Строка(СтрокаТЗ[ИмяПервойКолонки]));
					КонецЕсли;
						
					Если ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] Тогда
						СтрокаТЗ[ИмяКолонкиКлюч1] = СокрЛП(ВРег(Строка(СтрокаТЗ[ИмяКолонкиКлюч1])));
					КонецЕсли;
					
					Если ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
						СтрокаТЗ[ИмяКолонкиКлюч1] = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(СтрокаТЗ[ИмяКолонкиКлюч1]), "{", ""), "}", ""));
					КонецЕсли;
					
				Исключение
					
					ТекстОшибки = "Ошибка при обработке ключа в строке " + СчетчикСтрок + " выборки из базы " + ИдентификаторБазы + ": " + ОписаниеОшибки();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					
				КонецПопытки;
				
				Если ЧислоСтолбцовВКлюче > 1 Тогда
						
					Попытка
						
						Если ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы]
							Или ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы]
							Или ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
							СтрокаТЗ[ИмяКолонкиКлюч2] = СокрЛП(Строка(СтрокаТЗ[ИмяВторойКолонки]));
						КонецЕсли;

						Если ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] Тогда
							СтрокаТЗ[ИмяКолонкиКлюч2] = СокрЛП(ВРег(Строка(СтрокаТЗ[ИмяКолонкиКлюч2])));
						КонецЕсли;
						
						Если ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
							СтрокаТЗ[ИмяКолонкиКлюч2] = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(СтрокаТЗ[ИмяКолонкиКлюч2]), "{", ""), "}", ""));
						КонецЕсли;
						
					Исключение
						
						ТекстОшибки = "Ошибка при обработке столбца 2 ключа в строке " + СчетчикСтрок + " выборки из базы " + ИдентификаторБазы + ": " + ОписаниеОшибки();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
						
					КонецПопытки;
					
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда
						
					Попытка
						
						Если ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы]
							Или ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы]
							Или ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
							СтрокаТЗ[ИмяКолонкиКлюч3] = СокрЛП(Строка(СтрокаТЗ[ИмяТретьейКолонки]));
						КонецЕсли;
						
						Если ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] Тогда
							СтрокаТЗ[ИмяКолонкиКлюч3] = СокрЛП(ВРег(Строка(СтрокаТЗ[ИмяКолонкиКлюч3])));
						КонецЕсли;
						
						Если ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
							СтрокаТЗ[ИмяКолонкиКлюч3] = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(СтрокаТЗ[ИмяКолонкиКлюч3]), "{", ""), "}", ""));
						КонецЕсли;
						
					Исключение
						
						ТекстОшибки = "Ошибка при обработке столбца 3 ключа в строке " + СчетчикСтрок + " выборки из базы " + ИдентификаторБазы + ": " + ОписаниеОшибки();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
						
					КонецПопытки;
					
				КонецЕсли;
						
#Область Произвольный_код_обработки_ключа

				КлючТек = СтрокаТЗ[ИмяКолонкиКлюч1];
				Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча1" + ИдентификаторБазы] Тогда
					Попытка
					    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча1" + ИдентификаторБазы];
					Исключение
						ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 1: """ + КлючТек + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
						Сообщить(ТекстОшибки);
					КонецПопытки;
				КонецЕсли;
				СтрокаТЗ[ИмяКолонкиКлюч1] = КлючТек;
				
				Если ЧислоСтолбцовВКлюче > 1 Тогда
					КлючТек = СтрокаТЗ[ИмяКолонкиКлюч2];
					Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча2" + ИдентификаторБазы] Тогда
						Попытка
						    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча2" + ИдентификаторБазы];
						Исключение
							ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 2: """ + КлючТек + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
							Сообщить(ТекстОшибки);
						КонецПопытки;
					КонецЕсли;
					СтрокаТЗ[ИмяКолонкиКлюч2] = КлючТек;
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда
					КлючТек = СтрокаТЗ[ИмяКолонкиКлюч3];
					Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча3" + ИдентификаторБазы] Тогда
						Попытка
						    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча3" + ИдентификаторБазы];
						Исключение
							ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 3: """ + КлючТек + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
							Сообщить(ТекстОшибки);
						КонецПопытки;
					КонецЕсли;
					СтрокаТЗ[ИмяКолонкиКлюч3] = КлючТек;
				КонецЕсли;

	#КонецОбласти
				
			КонецЦикла;
			
			Если ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы] 
				Или ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] 
				Или ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
			
				ТЗ.Колонки.Удалить(ИмяПервойКолонки);
			
			КонецЕсли;
		
			Если ЧислоСтолбцовВКлюче > 1 Тогда
								
				Если ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы] 
					Или ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] 
					Или ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
					
					ТЗ.Колонки.Удалить(ИмяВторойКолонки);
					
				КонецЕсли;
				
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
								
				Если ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы] 
					Или ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] 
					Или ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
					
					ТЗ.Колонки.Удалить(ИмяТретьейКолонки);
					
				КонецЕсли;
				
			КонецЕсли;
			
		КонецЕсли;
		
#КонецОбласти

		//Индексирование
		КолонкиСКлючомСтрокой = ИмяКолонкиКлюч1;
		Если ЧислоСтолбцовВКлюче > 1 Тогда
			КолонкиСКлючомСтрокой = КолонкиСКлючомСтрокой + "," + ИмяКолонкиКлюч2;
		КонецЕсли;
		Если ЧислоСтолбцовВКлюче > 2 Тогда
			КолонкиСКлючомСтрокой = КолонкиСКлючомСтрокой + "," + ИмяКолонкиКлюч3;
		КонецЕсли;

		ТЗ.Индексы.Добавить(КолонкиСКлючомСтрокой);
		
		Для СчетчикРеквизитов = 1 По ЭтотОбъект["НастройкиФайла" + ИдентификаторБазы].Количество() Цикл
			
			ИмяРеквизита = Строка(ИдентификаторБазы) + СчетчикРеквизитов;
			ЗаголовокРеквизитаИзНастроек = ЭтотОбъект["НастройкиФайла" + ИдентификаторБазы][СчетчикРеквизитов - 1].ЗаголовокРеквизитаДляПользователя;
			
			ПредставленияЗаголовковРеквизитов[ИмяРеквизита] = ?(ПустаяСтрока(ЗаголовокРеквизитаИзНастроек), "Реквизит " + ИдентификаторБазы + СчетчикРеквизитов, ИмяРеквизита + ": " + ЗаголовокРеквизитаИзНастроек);
		
		КонецЦикла;
		
	КонецЕсли;
	
	Возврат ТЗ;
	
КонецФункции

Функция ВыполнитьЗапросSQLИПолучитьТЗ(ИдентификаторБазы, ТекстОшибок = "")
	
	ServerName =  ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Сервер"];
	DSN 	= ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "ПутьКБазе"];                                                                                                           
	UID 	= ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Логин"];
	PWD 	= ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Пароль"];
	Driver 	= ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "ДрайверSQL"];
	
	Попытка              
		ConnectString = "Driver={" + Driver + "};Server="+ServerName+";Database="+DSN+";Uid="+UID+";Pwd="+PWD;
		Соединение = Новый COMОбъект("ADODB.Connection");
		Соединение.Open(ConnectString); 
	Исключение
		ТекстОшибки = ОписаниеОшибки();
		Сообщить("Не удалось подключиться к : " + ТекстОшибки);
		Возврат Неопределено;
	КонецПопытки;
	
	СмещениеНомераРеквизита = ЧислоСтолбцовВКлюче - 1;
		
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Ключ1");
	КолонкиСКлючомСтрокой = "Ключ1";
	
	Если ЧислоСтолбцовВКлюче > 1 Тогда
		ТЗ.Колонки.Добавить("Ключ2");
		КолонкиСКлючомСтрокой = КолонкиСКлючомСтрокой + ",Ключ2";
	КонецЕсли;
	
	Если ЧислоСтолбцовВКлюче > 2 Тогда
		ТЗ.Колонки.Добавить("Ключ3");
		КолонкиСКлючомСтрокой = КолонкиСКлючомСтрокой + ",Ключ3";
	КонецЕсли;
	
	ТЗ.Колонки.Добавить("Реквизит1");
	ТЗ.Колонки.Добавить("Реквизит2");
	ТЗ.Колонки.Добавить("Реквизит3");
	ТЗ.Колонки.Добавить("Реквизит4");
	ТЗ.Колонки.Добавить("Реквизит5");
	
	Попытка
		
		Рекордсет = Новый COMОбъект("ADODB.RecordSet"); 
		Command = Новый COMОбъект("ADODB.Command");
		Command.ActiveConnection = Соединение;
		Command.CommandText = ЭтотОбъект["ТекстЗапроса" + ИдентификаторБазы];
		Command.CommandType = 1;
		
		Рекордсет = Command.Execute();
		
		ЧислоКолонокВТЗ = Рекордсет.Fields.Count;
		Если ЧислоСтолбцовВКлюче > ЧислоКолонокВТЗ Тогда
			
			ТекстОшибки = "Выборка из источника " + ИдентификаторБазы + " содержит " + ЧислоКолонокВТЗ + " кол., проверьте корректность заданного числа столбцов в ключе";
			СообщениеПользователю = Новый СообщениеПользователю;
			СообщениеПользователю.Текст = ТекстОшибки;
			СообщениеПользователю.Поле = "Объект.ЧислоСтолбцовВКлюче";
			СообщениеПользователю.Сообщить();
			ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			Рекордсет.Close();
			Соединение.Close();
			
			Возврат Неопределено;
			
		КонецЕсли;
				
		СчетчикСтрок = 0;			
		Пока Рекордсет.EOF = 0 Цикл
			
			СчетчикСтрок = СчетчикСтрок + 1;
			
			Если СчетчикСтрок = 1 Тогда
				
				Для СчетчикРеквизитов = 1 По Мин(ЧислоКолонокВТЗ - ЧислоСтолбцовВКлюче, ЧислоРеквизитов) Цикл
					
					Если ЭтотОбъект["НастройкиФайла" + ИдентификаторБазы].Количество() >= СчетчикРеквизитов Тогда
						ЗаголовокРеквизитаИзНастроек = ЭтотОбъект["НастройкиФайла" + ИдентификаторБазы][СчетчикРеквизитов - 1].ЗаголовокРеквизитаДляПользователя;
					Иначе
						ЗаголовокРеквизитаИзНастроек = "";
					КонецЕсли;
					
					ИмяРеквизита = Строка(ИдентификаторБазы) + СчетчикРеквизитов;
					ПредставленияЗаголовковРеквизитов[ИмяРеквизита] = ИмяРеквизита + ": " + ?(ПустаяСтрока(ЗаголовокРеквизитаИзНастроек), Рекордсет.Fields(СчетчикРеквизитов + ЧислоСтолбцовВКлюче - 1).Name, ЗаголовокРеквизитаИзНастроек);
				
				КонецЦикла; 
				
			КонецЕсли;
			
			СтрокаТЗ = ТЗ.Добавить();
			
			Ключ1 = Рекордсет.Fields(0).Value;
			
			Если ЧислоСтолбцовВКлюче > 1 Тогда
				Ключ2 = Рекордсет.Fields(1).Value;
			Иначе
				Ключ2 = "";				
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
				Ключ3 = Рекордсет.Fields(2).Value;
			Иначе
				Ключ3 = "";				
			КонецЕсли;
			
			Попытка
				
				Если ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(Строка(Ключ1));
				КонецЕсли;
			
				Если ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(ВРег(Строка(Ключ1)));
				КонецЕсли;
				
				Если ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ1), "{", ""), "}", ""));
				КонецЕсли;
				
			Исключение
				
				ТекстОшибки = "Ошибка при обработке ключа в строке " + СчетчикСтрок + " выборки из базы " + ИдентификаторБазы + ": " + ОписаниеОшибки();
				ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				
			КонецПопытки;
			
			Если ЧислоСтолбцовВКлюче > 1 Тогда
				
				Попытка
				
					Если ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(Строка(Ключ2));
					КонецЕсли;
				
					Если ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(ВРег(Строка(Ключ2)));
					КонецЕсли;
					
					Если ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ2), "{", ""), "}", ""));
					КонецЕсли;
				
				Исключение
					
					ТекстОшибки = "Ошибка при обработке столбца 2 ключа в строке " + СчетчикСтрок + " выборки из базы " + ИдентификаторБазы + ": " + ОписаниеОшибки();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					
				КонецПопытки;
				
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
				
				Попытка
				
				Если ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы] Тогда
					Ключ3 = СокрЛП(Строка(Ключ3));
				КонецЕсли;
			
				Если ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] Тогда
					Ключ3 = СокрЛП(ВРег(Строка(Ключ3)));
				КонецЕсли;
				
				Если ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
					Ключ3 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ3), "{", ""), "}", ""));
				КонецЕсли;
				
				Исключение
					
					ТекстОшибки = "Ошибка при обработке столбца 3 ключа в строке " + СчетчикСтрок + " выборки из базы " + ИдентификаторБазы + ": " + ОписаниеОшибки();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					
				КонецПопытки;
				
			КонецЕсли;
			          			
#Область Произвольный_код_обработки_ключа

			КлючТек = Ключ1;
			Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча1" + ИдентификаторБазы] Тогда
				Попытка
				    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча1" + ИдентификаторБазы];
				Исключение
					ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 1: """ + Ключ1 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
					Сообщить(ТекстОшибки);
				КонецПопытки;
			КонецЕсли;
			СтрокаТЗ.Ключ1 = КлючТек;
			
			Если ЧислоСтолбцовВКлюче > 1 Тогда
				КлючТек = Ключ2;				
				Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча2" + ИдентификаторБазы] Тогда
					Попытка
					    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча2" + ИдентификаторБазы];
					Исключение
						ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 2: """ + Ключ2 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
						Сообщить(ТекстОшибки);
					КонецПопытки;
				КонецЕсли;
				СтрокаТЗ.Ключ2 = КлючТек;
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
				КлючТек = Ключ3;
				Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча3" + ИдентификаторБазы] Тогда
					Попытка
					    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча3" + ИдентификаторБазы];
					Исключение
						ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 3: """ + Ключ3 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
						Сообщить(ТекстОшибки);
					КонецПопытки;
				КонецЕсли;
				СтрокаТЗ.Ключ3 = КлючТек;
			КонецЕсли;
			
#КонецОбласти 
			
			ЧислоКолонокВВыборке = Рекордсет.Fields.Count;
			
			Для Счетчик = 1 По Мин(ЧислоРеквизитов, ЧислоКолонокВВыборке - ЧислоСтолбцовВключе) Цикл
				СтрокаТЗ["Реквизит" + Счетчик] = Рекордсет.Fields(Счетчик + ЧислоСтолбцовВключе - 1).Value 
			КонецЦикла;
			
			Рекордсет.MoveNext();
			
		КонецЦикла;

		Рекордсет.Close();
		Соединение.Close();
		
	Исключение
		
		ТекстОшибки = ОписаниеОшибки();
		ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
		ТЗ = Неопределено;
		
	КонецПопытки;
	
	//Индексирование
	Если ТЗ <> Неопределено Тогда
		ТЗ.Индексы.Добавить(КолонкиСКлючомСтрокой);
	КонецЕсли;
	
	Возврат ТЗ;
	
КонецФункции

Функция ПрочитатьДанныеИзФайлаИПолучитьТЗ(ИдентификаторБазы, ТекстОшибок = "")
	
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Ключ1");
	КолонкиСКлючомСтрокой = "Ключ1";
	
	Если ЧислоСтолбцовВКлюче > 1 Тогда
		ТЗ.Колонки.Добавить("Ключ2");
		КолонкиСКлючомСтрокой = КолонкиСКлючомСтрокой + ",Ключ2";
	КонецЕсли;
	
	Если ЧислоСтолбцовВКлюче > 2 Тогда
		ТЗ.Колонки.Добавить("Ключ3");
		КолонкиСКлючомСтрокой = КолонкиСКлючомСтрокой + ",Ключ3";
	КонецЕсли;
	
	ТЗ.Колонки.Добавить("Реквизит1");
	ТЗ.Колонки.Добавить("Реквизит2");
	ТЗ.Колонки.Добавить("Реквизит3");
	ТЗ.Колонки.Добавить("Реквизит4");
	ТЗ.Колонки.Добавить("Реквизит5");
	
	ПутьКФайлу 			= ЭтотОбъект["ПодключениеКВнешнейБазе"		+ ИдентификаторБазы + "ПутьКФайлу"];
	ФорматФайла 		= ЭтотОбъект["ПодключениеКВнешнейБазе" 		+ ИдентификаторБазы + "ФорматФайла"];
	НомерПервойСтроки 	= ЭтотОбъект["НомерПервойСтрокиФайла" 		+ ИдентификаторБазы];
	НастройкиФайла 		= ЭтотОбъект["НастройкиФайла" 				+ ИдентификаторБазы];
	НомерТаблицы		= ЭтотОбъект["ПодключениеКВнешнейБазе"		+ ИдентификаторБазы + "НомерТаблицыВФайле"];
	
	НомерСтолбцаСКлючом = ЭтотОбъект["НомерСтолбцаСКлючомИзФайла" 	+ ИдентификаторБазы];
	ИмяСтолбцаСКлючом 	= ЭтотОбъект["ИмяСтолбцаСКлючомИзФайла" 	+ ИдентификаторБазы];	
	Если ЧислоСтолбцовВКлюче > 1 Тогда
		НомерСтолбцаСКлючом2 	= ЭтотОбъект["НомерСтолбцаСКлючом2ИзФайла" + ИдентификаторБазы];
		ИмяСтолбцаСКлючом2 		= ЭтотОбъект["ИмяСтолбцаСКлючом2ИзФайла" + ИдентификаторБазы];
	КонецЕсли;	
	Если ЧислоСтолбцовВКлюче > 2 Тогда
		НомерСтолбцаСКлючом3 	= ЭтотОбъект["НомерСтолбцаСКлючом3ИзФайла" + ИдентификаторБазы];
		ИмяСтолбцаСКлючом3 		= ЭтотОбъект["ИмяСтолбцаСКлючом3ИзФайла" + ИдентификаторБазы];
	КонецЕсли;
	
	//Проверка открытия файла
	Если ФорматФайла = "XLS" Тогда
		
		Попытка
			Excel = Новый COMObject("Excel.Application");
			Excel.DisplayAlerts = 0;
			Excel.Visible = Ложь;
			
			Книга = Excel.WorkBooks.Open(ПутьКФайлу);
			Файл = Книга.WorkSheets(НомерТаблицы);
		Исключение
			ТекстОшибки = "Ошибка при открытии XLS-файла " + ПутьКФайлу + ": " + ОписаниеОшибки();
			ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			Возврат Неопределено;
		КонецПопытки;
		
		xlCellTypeLastCell = 11;
		
		Попытка
			НомерПоследнейСтроки = Файл.Cells.SpecialCells(xlCellTypeLastCell).Row;			
		Исключение
			Сообщить("Ошибка при определении номера последней строки в файле. Номер последней строки установлен в 1000");
			НомерПоследнейСтроки = 1000;
		КонецПопытки;
		
		Попытка
			НомерПоследнейКолонки = Файл.Cells.SpecialCells(xlCellTypeLastCell).Column;
		Исключение			
			НомерПоследнейКолонки = 1000;
		КонецПопытки;
				
	ИначеЕсли ФорматФайла = "DOC" Тогда
		
		Попытка
			Word = Новый COMObject("Word.Application");
			Word.DisplayAlerts = 0;
			Word.Visible = Ложь;
			
			Word.Application.Documents.Open(ПутьКФайлу);
			Документ = Word.ActiveDocument();
			
		Исключение
			ТекстОшибки = "Ошибка при открытии DOC-файла " + ПутьКФайлу + ": " + ОписаниеОшибки();
			ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			Word = Неопределено;
			Возврат Неопределено;
		КонецПопытки;
		
		Попытка 
			Файл = Документ.Tables(НомерТаблицы);
		Исключение
			ТекстОшибки = "Ошибка при обращении к таблице " + НомерТаблицы + " DOC-файла " + ПутьКФайлу + ": " + ОписаниеОшибки();
			ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			Документ.Close(0);
			Word.Quit();
			Возврат Неопределено;
		КонецПопытки;

		Попытка
			НомерПоследнейСтроки = Файл.Rows.count;
		Исключение
			Сообщить("Ошибка при определении номера последней строки в файле. Номер последней строки установлен в 1000");
			НомерПоследнейСтроки = 1000;
		КонецПопытки;
		
	ИначеЕсли ФорматФайла = "CSV" Или ФорматФайла = "TXT" Тогда
		
		Попытка
			Файл = Новый ТекстовыйДокумент();
			Файл.Прочитать(ПутьКФайлу);
			НомерПоследнейСтроки = Файл.КоличествоСтрок(); 
		Исключение
			ТекстОшибки = "Ошибка при открытии " + ФорматФайла + "-файла " + ПутьКФайлу + ": " + ОписаниеОшибки();
			ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			Возврат Неопределено;
		КонецПопытки;
		
	ИначеЕсли ФорматФайла = "DBF" Тогда 
		
		Попытка
			ФайлDBF = Новый XBase;
			ФайлDBF.ОткрытьФайл(ПутьКФайлу,,Истина);
			НомерПоследнейСтроки = ФайлDBF.КоличествоЗаписей();
			ФайлDBF.Первая();
		Исключение
			ТекстОшибки = "Ошибка при открытии DBF-файла " + ПутьКФайлу + ": " + ОписаниеОшибки();
			ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			Возврат Неопределено;
		КонецПопытки;

	ИначеЕсли ФорматФайла = "XML" Тогда
		
		Попытка
			Парсер = Новый ЧтениеXML;
		    Парсер.ОткрытьФайл(ПутьКФайлу);	 
		    Построитель = Новый ПостроительDOM;	 
		    ФайлXML = Построитель.Прочитать(Парсер);
		Исключение
			ТекстОшибки = "Ошибка при открытии XML-файла " + ПутьКФайлу + ": " + ОписаниеОшибки();
			ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			Возврат Неопределено
		КонецПопытки;
		
	Иначе
		
		ТекстОшибки = "Формат файла '" + ФорматФайла + "' не предусмотрен";
		ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
		Возврат Неопределено;
		
	КонецЕсли;
	
	//Обработка строк
#Область XML
	
	Если ФорматФайла = "XML" Тогда
		
		ИмяРодительскогоУзла = ЭтотОбъект["ИмяРодительскогоУзлаФайла" + ИдентификаторБазы];
		ИмяЭлементаСДаннымиФайла = ЭтотОбъект["ИмяЭлементаСДаннымиФайла" + ИдентификаторБазы];
		
		КорневойУзел = ФайлXML.ЭлементДокумента;
		Если ПустаяСтрока(ИмяРодительскогоУзла) Тогда
			РодительскийУзел = КорневойУзел
		Иначе
			РодительскийУзел = НайтиПодчиненныйУзелXMLФайлаПоИмени(КорневойУзел, ИмяРодительскогоУзла);
		КонецЕсли;
		
		Если РодительскийУзел <> Неопределено Тогда
			
			Для Каждого ТекущийЭлемент Из РодительскийУзел.ДочерниеУзлы Цикл
				
				Если ПустаяСтрока(ИмяЭлементаСДаннымиФайла) Или ТекущийЭлемент.ИмяУзла = ИмяЭлементаСДаннымиФайла Тогда
					
#Область XML_СпособХраненияДанныхВXMLФайле_В_атрибутах
				
					Если ЭтотОбъект["СпособХраненияДанныхВXMLФайле" + ИдентификаторБазы] = "В атрибутах" Тогда
						
						ЗаполнитьПеременныеРЗначениямиПоУмолчанию();
												
						СтрокаПриемник = ТЗ.Добавить();
						
						Элемент = ТекущийЭлемент.Атрибуты.ПолучитьИменованныйЭлемент(ИмяСтолбцаСКлючом);
						Если Элемент = Неопределено Тогда
							ВызватьИсключение "Атрибут с именем " + ИмяСтолбцаСКлючом + " не найден";
						КонецЕсли;
						
						Ключ1 = Элемент.Значение;
						Если ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] Тогда
							Ключ1 = СокрЛП(ВРег(Строка(Ключ1)));
						КонецЕсли;
						Если ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
							Ключ1 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ1), "{", ""), "}", ""));
						КонецЕсли;
						
						Если ЧислоСтолбцовВКлюче > 1 Тогда
						
							Элемент = ТекущийЭлемент.Атрибуты.ПолучитьИменованныйЭлемент(ИмяСтолбцаСКлючом2);
							Если Элемент = Неопределено Тогда
								ВызватьИсключение "Атрибут с именем " + ИмяСтолбцаСКлючом2 + " не найден";
							КонецЕсли;
							
							Ключ2 = Элемент.Значение;
									
							Если ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы] Тогда
								Ключ2 = СокрЛП(Строка(Ключ2));
							КонецЕсли;
							
							Если ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] Тогда
								Ключ2 = СокрЛП(ВРег(Строка(Ключ2)));
							КонецЕсли;
							
							Если ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
								Ключ2 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ2), "{", ""), "}", ""));
							КонецЕсли;
														
						КонецЕсли;
						
						Если ЧислоСтолбцовВКлюче > 2 Тогда
						
							Элемент = ТекущийЭлемент.Атрибуты.ПолучитьИменованныйЭлемент(ИмяСтолбцаСКлючом3);
							Если Элемент = Неопределено Тогда
								ВызватьИсключение "Атрибут с именем " + ИмяСтолбцаСКлючом3 + " не найден";
							КонецЕсли;
							
							Ключ3 = Элемент.Значение;
									
							Если ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы] Тогда
								Ключ3 = СокрЛП(Строка(Ключ3));
							КонецЕсли;
							
							Если ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] Тогда
								Ключ3 = СокрЛП(ВРег(Строка(Ключ3)));
							КонецЕсли;
							
							Если ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
								Ключ3 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ3), "{", ""), "}", ""));
							КонецЕсли;
							
						КонецЕсли;
						
#Область Произвольный_код_обработки_ключа

						КлючТек = Ключ1;
						Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча1" + ИдентификаторБазы] Тогда
							Попытка
							    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча1" + ИдентификаторБазы];
							Исключение
								ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 1: """ + Ключ1 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
								Сообщить(ТекстОшибки);
							КонецПопытки;
						КонецЕсли;
						
						СтрокаПриемник.Ключ1 = КлючТек;
						
						Если ЧислоСтолбцовВКлюче > 1 Тогда
							
							КлючТек = Ключ2;
							Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча2" + ИдентификаторБазы] Тогда
								Попытка
								    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча2" + ИдентификаторБазы];
								Исключение
									ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 2: """ + Ключ2 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
									Сообщить(ТекстОшибки);
								КонецПопытки;
							КонецЕсли;
							СтрокаПриемник.Ключ2 = КлючТек;
							
						КонецЕсли;
						
						Если ЧислоСтолбцовВКлюче > 2 Тогда
							
							КлючТек = Ключ3;
							Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча3" + ИдентификаторБазы] Тогда
								Попытка
								    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча3" + ИдентификаторБазы];
								Исключение
									ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 3: """ + Ключ3 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
									Сообщить(ТекстОшибки);
								КонецПопытки;
							КонецЕсли;
							СтрокаПриемник.Ключ3 = КлючТек;
							
						КонецЕсли;
						
#КонецОбласти  

						ЗаполнитьПеременныеРЗначениямиПоУмолчанию();
						Для Каждого СтрокаНастроекФайла Из НастройкиФайла Цикл
							
							//Не задано имя колонки (например, если реквизит заполняется программно)
							Если ПустаяСтрока(СтрокаНастроекФайла.ИмяКолонки) Тогда
								Продолжить;
							КонецЕсли;
							
							ИмяРеквизита = "Реквизит" + СтрокаНастроекФайла.НомерСтроки;
							Элемент = ТекущийЭлемент.Атрибуты.ПолучитьИменованныйЭлемент(СтрокаНастроекФайла.ИмяКолонки);
							Если Элемент = Неопределено Тогда
								ВызватьИсключение "Атрибут с именем " + СтрокаНастроекФайла.ИмяКолонки + " не найден";
							КонецЕсли;
							СтрокаПриемник[ИмяРеквизита] = Элемент.Значение;
							
							//Заполнение переменных, которые будут использоваться в произвольном коде
							РВрем = СтрокаПриемник[ИмяРеквизита];
							Если СтрокаНастроекФайла.НомерСтроки = 1 Тогда
								Р1 = РВрем;
							ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 2 Тогда
								Р2 = РВрем;
							ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 3 Тогда
								Р3 = РВрем;
							ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 4 Тогда
								Р4 = РВрем;
							ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 5 Тогда
								Р5 = РВрем;
							КонецЕсли;

						КонецЦикла;
						
#КонецОбласти

#Область XML_СпособХраненияДанныхВXMLФайле_В_элементах
						
					ИначеЕсли ЭтотОбъект["СпособХраненияДанныхВXMLФайле" + ИдентификаторБазы] = "В элементах" Тогда
						
						ЗаполнитьПеременныеРЗначениямиПоУмолчанию();
						
						СтрокаПриемник = ТЗ.Добавить();
						
						Для Каждого ДочернийЭлемент Из ТекущийЭлемент.ДочерниеУзлы Цикл
							
							Если ДочернийЭлемент.ИмяУзла = ИмяСтолбцаСКлючом Тогда
								
								Ключ1 = ДочернийЭлемент.ТекстовоеСодержимое;
								Если ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] Тогда
									Ключ1 = СокрЛП(ВРег(Строка(Ключ1)));
								КонецЕсли;
								Если ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
									Ключ1 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ1), "{", ""), "}", ""));
								КонецЕсли;
								
								СтрокаПриемник.Ключ1 = Ключ1;
								
							КонецЕсли;
								
							Если ДочернийЭлемент.ИмяУзла = ИмяСтолбцаСКлючом2 И ЧислоСтолбцовВКлюче > 1 Тогда
								
								Ключ2 = ДочернийЭлемент.ТекстовоеСодержимое;
								Если ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] Тогда
									Ключ2 = СокрЛП(ВРег(Строка(Ключ2)));
								КонецЕсли;
								Если ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
									Ключ2 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ2), "{", ""), "}", ""));
								КонецЕсли;
								
								СтрокаПриемник.Ключ2 = Ключ2;
			                    						
							КонецЕсли;                
							
							Если ДочернийЭлемент.ИмяУзла = ИмяСтолбцаСКлючом3 И ЧислоСтолбцовВКлюче > 2 Тогда
								
								Ключ3 = ДочернийЭлемент.ТекстовоеСодержимое;
								Если ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] Тогда
									Ключ3 = СокрЛП(ВРег(Строка(Ключ2)));
								КонецЕсли;
								Если ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
									Ключ3 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ3), "{", ""), "}", ""));
								КонецЕсли;
								
								СтрокаПриемник.Ключ3 = Ключ3;
			                    						
							КонецЕсли;
							
							Для Каждого СтрокаНастроекФайла Из НастройкиФайла Цикл
							
								//Не задано имя колонки (например, если реквизит заполняется программно)
								Если ПустаяСтрока(СтрокаНастроекФайла.ИмяКолонки) Тогда
									Продолжить;
								КонецЕсли;
								
								ИмяЭлемента = СтрокаНастроекФайла.ИмяКолонки;
								ИмяРеквизита = "Реквизит" + СтрокаНастроекФайла.НомерСтроки;
								Если ДочернийЭлемент.ИмяУзла = ИмяЭлемента Тогда
									
									СтрокаПриемник[ИмяРеквизита] = ДочернийЭлемент.ТекстовоеСодержимое;;
									
								КонецЕсли;
																
							КонецЦикла;
							
						КонецЦикла;
						
#Область Произвольный_код_обработки_ключа
						КлючТек = СтрокаПриемник.Ключ1;
						Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча1" + ИдентификаторБазы] Тогда
							Попытка
							    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча1" + ИдентификаторБазы];
							Исключение
								ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 1: """ + Ключ1 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
								Сообщить(ТекстОшибки);
							КонецПопытки;
						КонецЕсли;
						СтрокаПриемник.Ключ1 = КлючТек;
						
						Если ЧислоСтолбцовВКлюче > 1 Тогда
							
							КлючТек = СтрокаПриемник.Ключ2;
							Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча2" + ИдентификаторБазы] Тогда
								Попытка
								    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча2" + ИдентификаторБазы];
								Исключение
									ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 2: """ + Ключ2 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
									Сообщить(ТекстОшибки);
								КонецПопытки;
							КонецЕсли;
							СтрокаПриемник.Ключ2 = КлючТек;
							
						КонецЕсли;
						
						Если ЧислоСтолбцовВКлюче > 2 Тогда
							КлючТек = СтрокаПриемник.Ключ3;
							Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча3" + ИдентификаторБазы] Тогда
								Попытка
								    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча3" + ИдентификаторБазы];
								Исключение
									ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 3: """ + Ключ3 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
									Сообщить(ТекстОшибки);
								КонецПопытки;
							КонецЕсли;
							СтрокаПриемник.Ключ3 = КлючТек;
						КонецЕсли;
#КонецОбласти 

						ЗаполнитьПеременныеРЗначениямиПоУмолчанию();
						Для Каждого СтрокаНастроекФайла Из НастройкиФайла Цикл
							//Не задано имя колонки (например, если реквизит заполняется программно)
							Если ПустаяСтрока(СтрокаНастроекФайла.ИмяКолонки) Тогда
								Продолжить;
							КонецЕсли;
							
							ИмяРеквизита = "Реквизит" + СтрокаНастроекФайла.НомерСтроки;
							
							РВрем = СтрокаПриемник[ИмяРеквизита];
							Если СтрокаНастроекФайла.НомерСтроки = 1 Тогда
								Р1 = РВрем;
							ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 2 Тогда
								Р2 = РВрем;
							ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 3 Тогда
								Р3 = РВрем;
							ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 4 Тогда
								Р4 = РВрем;
							ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 5 Тогда
								Р5 = РВрем;
							КонецЕсли;
							
						КонецЦикла;
																		
					Иначе 
						ВызватьИсключение "Не задан способ хранения данных в XML-файле базы " + ИдентификаторБазы;				
					КонецЕсли;
					
					Для Каждого СтрокаНастроекФайла Из НастройкиФайла Цикл
				
						ИмяРеквизита = "Реквизит" + СтрокаНастроекФайла.НомерСтроки;
						РТек = СтрокаПриемник[ИмяРеквизита];

						Попытка
							Выполнить СтрокаНастроекФайла.ПроизвольныйКод;
						Исключение
							ТекстОшибки = ОписаниеОшибки();
							Сообщить("Ошибка при выполнении произвольного кода (реквизит " + СтрокаНастроекФайла.НомерСтроки + "):" + ТекстОшибки);
						КонецПопытки;
						
						Если ЭтотОбъект["СворачиватьТаблицу" + ИдентификаторБазы] Тогда
							Попытка
								Выполнить КодПриведенияРеквизитаКТипуЧисло;
							Исключение
								РТек = 0;
							КонецПопытки;
						КонецЕсли;
						
						СтрокаПриемник[ИмяРеквизита] = РТек;

					КонецЦикла;
					
#КонецОбласти

				КонецЕсли;
				
			КонецЦикла; 
			
		КонецЕсли;
		
#КонецОбласти 

	Иначе
	
		Для НомерТекущейСтроки = НомерПервойСтроки По НомерПоследнейСтроки Цикл
			
			ЗаполнитьПеременныеРЗначениямиПоУмолчанию();
			
			СтрокаПриемник = ТЗ.Добавить();
			
#Область XLS

			Если ФорматФайла = "XLS" Тогда
				
				ЧислоКолонокВФайлеМеньшеТребуемого = Ложь;
				
				Если НомерСтолбцаСКлючом > НомерПоследнейКолонки Тогда
					ТекстОшибки = "Файл " + ИдентификаторБазы + " содержит " + НомерПоследнейКолонки + " кол., проверьте настройки столбцов ключа";
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.НомерСтолбцаСКлючомИзФайла " + ИдентификаторБазы;
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					ЧислоКолонокВФайлеМеньшеТребуемого = Истина;
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 1 И НомерСтолбцаСКлючом2 > НомерПоследнейКолонки Тогда
					ТекстОшибки = "Файл " + ИдентификаторБазы + " содержит " + НомерПоследнейКолонки + " кол., проверьте настройки столбца 2 ключа";
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.НомерСтолбцаСКлючом2ИзФайла " + ИдентификаторБазы;
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					ЧислоКолонокВФайлеМеньшеТребуемого = Истина;
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 И НомерСтолбцаСКлючом3 > НомерПоследнейКолонки Тогда
					ТекстОшибки = "Файл " + ИдентификаторБазы + " содержит " + НомерПоследнейКолонки + " кол., проверьте настройки столбца 3 ключа";
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.НомерСтолбцаСКлючом3ИзФайла " + ИдентификаторБазы;
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					ЧислоКолонокВФайлеМеньшеТребуемого = Истина;
				КонецЕсли;
				
				Если ЧислоКолонокВФайлеМеньшеТребуемого Тогда
					
					Книга.Close(0);
					Excel.Quit();
					Возврат ТЗ;
					
				КонецЕсли;
				
				Ключ1 = СокрЛП(Файл.Cells(НомерТекущейСтроки, НомерСтолбцаСКлючом).Value);
							
				Если ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(Строка(Ключ1));
				КонецЕсли;
				
				Если ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(ВРег(Строка(Ключ1)));
				КонецЕсли;
				
				Если ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ1), "{", ""), "}", ""));
				КонецЕсли;
								
				Если ЧислоСтолбцовВКлюче > 1 Тогда			
					
					Ключ2 = СокрЛП(Файл.Cells(НомерТекущейСтроки, НомерСтолбцаСКлючом2).Value);
							
					Если ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(Строка(Ключ2));
					КонецЕсли;
					
					Если ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(ВРег(Строка(Ключ2)));
					КонецЕсли;
					
					Если ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ2), "{", ""), "}", ""));
					КонецЕсли;
					     										
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда
										
					Ключ3 = СокрЛП(Файл.Cells(НомерТекущейСтроки, НомерСтолбцаСКлючом3).Value);
							
					Если ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы] Тогда
						Ключ3 = СокрЛП(Строка(Ключ3));
					КонецЕсли;
					
					Если ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] Тогда
						Ключ3 = СокрЛП(ВРег(Строка(Ключ3)));
					КонецЕсли;
					
					Если ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
						Ключ3 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ3), "{", ""), "}", ""));
					КонецЕсли;
					
				КонецЕсли;
				
				
#Область Произвольный_код_обработки_ключа

				КлючТек = Ключ1;
				Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча1" + ИдентификаторБазы] Тогда
					Попытка
					    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча1" + ИдентификаторБазы];
					Исключение
						ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 1: """ + Ключ1 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
						Сообщить(ТекстОшибки);
					КонецПопытки;
				КонецЕсли;
				СтрокаПриемник.Ключ1 = КлючТек;
				
				Если ЧислоСтолбцовВКлюче > 1 Тогда
					
					КлючТек = Ключ2;
					Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча2" + ИдентификаторБазы] Тогда
						Попытка
						    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча2" + ИдентификаторБазы];
						Исключение
							ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 2: """ + Ключ2 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
							Сообщить(ТекстОшибки);
						КонецПопытки;
					КонецЕсли;
					СтрокаПриемник.Ключ2 = КлючТек;
					
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда
					
					КлючТек = Ключ3;
					Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча3" + ИдентификаторБазы] Тогда
						Попытка
						    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча3" + ИдентификаторБазы];
						Исключение
							ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 3: """ + Ключ3 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
							Сообщить(ТекстОшибки);
						КонецПопытки;
					КонецЕсли;
					СтрокаПриемник.Ключ3 = КлючТек;
					
				КонецЕсли;
				
#КонецОбласти

				ЗаполнитьПеременныеРЗначениямиПоУмолчанию();
				Для Каждого СтрокаНастроекФайла Из НастройкиФайла Цикл
					//Не задан номер колонки (например, если реквизит заполняется программно)
					Если СтрокаНастроекФайла.НомерКолонки = 0 Тогда
						Продолжить;
					КонецЕсли;
					ИмяРеквизита = "Реквизит" + СтрокаНастроекФайла.НомерСтроки;
					
					Если СтрокаНастроекФайла.НомерКолонки > НомерПоследнейКолонки Тогда
						ТекстОшибки = "Файл " + ИдентификаторБазы + " содержит " + НомерПоследнейКолонки + " кол., проверьте настройки колонок реквизитов";
						СообщениеПользователю = Новый СообщениеПользователю;
						СообщениеПользователю.Текст = ТекстОшибки;
						СообщениеПользователю.Поле = "Объект.НастройкиФайла" + ИдентификаторБазы;
						СообщениеПользователю.Сообщить();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
						Возврат ТЗ;
					КонецЕсли;
					
					СтрокаПриемник[ИмяРеквизита] = СокрЛП(Файл.Cells(НомерТекущейСтроки, СтрокаНастроекФайла.НомерКолонки).Value);
					
					//Заполнение переменных, которые будут использоваться в произвольном коде
					РВрем = СтрокаПриемник[ИмяРеквизита];
					Если СтрокаНастроекФайла.НомерСтроки = 1 Тогда
						Р1 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 2 Тогда
						Р2 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 3 Тогда
						Р3 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 4 Тогда
						Р4 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 5 Тогда
						Р5 = РВрем;
					КонецЕсли;
					
				КонецЦикла;
							
#КонецОбласти 	

			
#Область DOC

			ИначеЕсли ФорматФайла = "DOC" Тогда

				//Из документа WORD попадают символы, которые 1С не может вывести в ТЗ на форме и выдает ошибку Текст XML содержит недопустимый символ
	        	ЗаменяемыеСимволы = Новый Массив;
				ЗаменяемыеСимволы.Добавить(Символ(7));	//¶
				ЗаменяемыеСимволы.Добавить(Символ(13));	//черный круг
								
				Ключ1 = СокрЛП(Файл.Cell(НомерТекущейСтроки, НомерСтолбцаСКлючом).Range.Text);
				Для Каждого ЗаменямыйСимвол Из ЗаменяемыеСимволы Цикл 
					Ключ1 = СтрЗаменить(Ключ1, ЗаменямыйСимвол, "");
				КонецЦикла;
							
				Если ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(Строка(Ключ1));
				КонецЕсли;
				
				Если ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(ВРег(Строка(Ключ1)));
				КонецЕсли;
				
				Если ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ1), "{", ""), "}", ""));
				КонецЕсли;
								
				Если ЧислоСтолбцовВКлюче > 1 Тогда
					
					Ключ2 = СокрЛП(Файл.Cell(НомерТекущейСтроки, НомерСтолбцаСКлючом2).Range.Text);
					Для Каждого ЗаменямыйСимвол Из ЗаменяемыеСимволы Цикл 
						Ключ2 = СтрЗаменить(Ключ2, ЗаменямыйСимвол, "");
					КонецЦикла;
					
					Если ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(Строка(Ключ2));
					КонецЕсли;
					
					Если ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(ВРег(Строка(Ключ2)));
					КонецЕсли;
					
					Если ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ2), "{", ""), "}", ""));
					КонецЕсли;
					     										
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда
					
					Ключ3 = СокрЛП(Файл.Cell(НомерТекущейСтроки, НомерСтолбцаСКлючом3).Range.Text);
					Для Каждого ЗаменямыйСимвол Из ЗаменяемыеСимволы Цикл 
						Ключ3 = СтрЗаменить(Ключ3, ЗаменямыйСимвол, "");
					КонецЦикла;

							
					Если ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы] Тогда
						Ключ3 = СокрЛП(Строка(Ключ3));
					КонецЕсли;
					
					Если ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] Тогда
						Ключ3 = СокрЛП(ВРег(Строка(Ключ3)));
					КонецЕсли;
					
					Если ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
						Ключ3 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ3), "{", ""), "}", ""));
					КонецЕсли;
					
				КонецЕсли;
				
				
#Область Произвольный_код_обработки_ключа

				КлючТек = Ключ1;
				Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча1" + ИдентификаторБазы] Тогда
					Попытка
					    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча1" + ИдентификаторБазы];
					Исключение
						ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 1: """ + Ключ1 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
						Сообщить(ТекстОшибки);
					КонецПопытки;
				КонецЕсли;
				СтрокаПриемник.Ключ1 = КлючТек;
				
				Если ЧислоСтолбцовВКлюче > 1 Тогда
					
					КлючТек = Ключ2;
					Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча2" + ИдентификаторБазы] Тогда
						Попытка
						    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча2" + ИдентификаторБазы];
						Исключение
							ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 2: """ + Ключ2 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
							Сообщить(ТекстОшибки);
						КонецПопытки;
					КонецЕсли;
					СтрокаПриемник.Ключ2 = КлючТек;
					
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда
					
					КлючТек = Ключ3;
					Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча3" + ИдентификаторБазы] Тогда
						Попытка
						    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча3" + ИдентификаторБазы];
						Исключение
							ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 3: """ + Ключ3 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
							Сообщить(ТекстОшибки);
						КонецПопытки;
					КонецЕсли;
					СтрокаПриемник.Ключ3 = КлючТек;
					
				КонецЕсли;
				
#КонецОбласти

				ЗаполнитьПеременныеРЗначениямиПоУмолчанию();
				Для Каждого СтрокаНастроекФайла Из НастройкиФайла Цикл
					//Не задан номер колонки (например, если реквизит заполняется программно)
					Если СтрокаНастроекФайла.НомерКолонки = 0 Тогда
						Продолжить;
					КонецЕсли;
					ИмяРеквизита = "Реквизит" + СтрокаНастроекФайла.НомерСтроки;
					ЗнчениеРеквизита = СокрЛП(Файл.Cell(НомерТекущейСтроки, СтрокаНастроекФайла.НомерКолонки).Range.Text);
					Для Каждого ЗаменямыйСимвол Из ЗаменяемыеСимволы Цикл 
						ЗнчениеРеквизита = СтрЗаменить(ЗнчениеРеквизита, ЗаменямыйСимвол, "");
					КонецЦикла;
					СтрокаПриемник[ИмяРеквизита] = ЗнчениеРеквизита;
					
					//Заполнение переменных, которые будут использоваться в произвольном коде
					РВрем = СтрокаПриемник[ИмяРеквизита];
					Если СтрокаНастроекФайла.НомерСтроки = 1 Тогда
						Р1 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 2 Тогда
						Р2 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 3 Тогда
						Р3 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 4 Тогда
						Р4 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 5 Тогда
						Р5 = РВрем;
					КонецЕсли;
					
				КонецЦикла;
							
#КонецОбласти 	


#Область CSV_TXT

			ИначеЕсли ФорматФайла = "CSV" Или ФорматФайла = "TXT" Тогда

				СтрокаТекста = Файл.ПолучитьСтроку(НомерТекущейСтроки);
						
				Если ФорматФайла = "CSV" Тогда
					СимволРазделителяКолонок = ";";
				Иначе
					СимволРазделителяКолонок = "	";
				КонецЕсли;	
				
				СимволРазделителя = Символы.ПС;
				
				СтрокаМногострочногоТекста = СтрЗаменить(СтрокаТекста,СимволРазделителяКолонок,СимволРазделителя);
				
				Ключ1 = СтрПолучитьСтроку(СтрокаМногострочногоТекста,НомерСтолбцаСКлючом);
				
				Если ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(Строка(Ключ1));
				КонецЕсли;
			
				Если ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(ВРег(Строка(Ключ1)));
				КонецЕсли;
				
				Если ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ1), "{", ""), "}", ""));
				КонецЕсли;
								
				Если ЧислоСтолбцовВКлюче > 1 Тогда
					
					Ключ2 = СтрПолучитьСтроку(СтрокаМногострочногоТекста,НомерСтолбцаСКлючом2);
				
					Если ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(Строка(Ключ2));
					КонецЕсли;
				
					Если ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(ВРег(Строка(Ключ2)));
					КонецЕсли;
					
					Если ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ2), "{", ""), "}", ""));
					КонецЕсли;
															
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда
					
					Ключ3 = СтрПолучитьСтроку(СтрокаМногострочногоТекста,НомерСтолбцаСКлючом3);
				
					Если ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы] Тогда
						Ключ3 = СокрЛП(Строка(Ключ3));
					КонецЕсли;
				
					Если ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] Тогда
						Ключ3 = СокрЛП(ВРег(Строка(Ключ3)));
					КонецЕсли;
					
					Если ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
						Ключ3 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ3), "{", ""), "}", ""));
					КонецЕсли;
										
				КонецЕсли;
				
#Область Произвольный_код_обработки_ключа

				КлючТек = Ключ1;
				Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча1" + ИдентификаторБазы] Тогда
					Попытка
					    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча1" + ИдентификаторБазы];
					Исключение
						ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 1: """ + Ключ1 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
						Сообщить(ТекстОшибки);
					КонецПопытки;
				КонецЕсли;
				СтрокаПриемник.Ключ1 = КлючТек;
				
				Если ЧислоСтолбцовВКлюче > 1 Тогда
					
					КлючТек = Ключ2;
					Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча2" + ИдентификаторБазы] Тогда
						Попытка
						    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча2" + ИдентификаторБазы];
						Исключение
							ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 2: """ + Ключ2 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
							Сообщить(ТекстОшибки);
						КонецПопытки;
					КонецЕсли;
					СтрокаПриемник.Ключ2 = КлючТек;
					
				КонецЕсли;

				Если ЧислоСтолбцовВКлюче > 2 Тогда
					
					КлючТек = Ключ3;
				 	Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча3" + ИдентификаторБазы] Тогда
						Попытка
						    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча3" + ИдентификаторБазы];
						Исключение
							ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 3: """ + Ключ3 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
							Сообщить(ТекстОшибки);
						КонецПопытки;
					КонецЕсли;
					СтрокаПриемник.Ключ3 = КлючТек;
					
				КонецЕсли;
				
#КонецОбласти 

				ЗаполнитьПеременныеРЗначениямиПоУмолчанию();
				Для Каждого СтрокаНастроекФайла Из НастройкиФайла Цикл
					//Не задан номер колонки (например, если реквизит заполняется программно)
					Если СтрокаНастроекФайла.НомерКолонки = 0 Тогда
						Продолжить;
					КонецЕсли;
					ИмяРеквизита = "Реквизит" + СтрокаНастроекФайла.НомерСтроки;
					СтрокаПриемник[ИмяРеквизита] = СтрПолучитьСтроку(СтрокаМногострочногоТекста,СтрокаНастроекФайла.НомерКолонки);
					
					//Заполнение переменных, которые будут использоваться в произвольном коде
					РВрем = СтрокаПриемник[ИмяРеквизита];
					Если СтрокаНастроекФайла.НомерСтроки = 1 Тогда
						Р1 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 2 Тогда
						Р2 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 3 Тогда
						Р3 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 4 Тогда
						Р4 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 5 Тогда
						Р5 = РВрем;
					КонецЕсли;
					
				КонецЦикла;

#КонецОбласти 	


#Область DBF

			ИначеЕсли ФорматФайла = "DBF" Тогда
				
				//На всякий случай, хотя такого не должно быть
				Если ФайлDBF.ВКонце() Тогда
					Продолжить;
				КонецЕсли;
				
				Ключ1 = ФайлDBF[ФайлDBF.Поля[НомерСтолбцаСКлючом - 1].Имя];
				
				Если ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(Строка(Ключ1));
				КонецЕсли;
			
				Если ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(ВРег(Строка(Ключ1)));
				КонецЕсли;
				
				Если ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ1), "{", ""), "}", ""));
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 1 Тогда
					
					Ключ2 = ФайлDBF[ФайлDBF.Поля[НомерСтолбцаСКлючом2 - 1].Имя];
				
					Если ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(Строка(Ключ2));
					КонецЕсли;
				
					Если ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(ВРег(Строка(Ключ2)));
					КонецЕсли;
					
					Если ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ2), "{", ""), "}", ""));
					КонецЕсли;
										
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда
					
					Ключ3 = ФайлDBF[ФайлDBF.Поля[НомерСтолбцаСКлючом3 - 1].Имя];
				
					Если ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы] Тогда
						Ключ3 = СокрЛП(Строка(Ключ3));
					КонецЕсли;
				
					Если ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] Тогда
						Ключ3 = СокрЛП(ВРег(Строка(Ключ3)));
					КонецЕсли;
					
					Если ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
						Ключ3 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ3), "{", ""), "}", ""));
					КонецЕсли;
										
				КонецЕсли;
				
#Область Произвольный_код_обработки_ключа

				КлючТек = Ключ1;
				Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча1" + ИдентификаторБазы] Тогда
					Попытка
					    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча1" + ИдентификаторБазы];
					Исключение
						ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 1: """ + Ключ1 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
						Сообщить(ТекстОшибки);
					КонецПопытки;
				КонецЕсли;
				СтрокаПриемник.Ключ1 = КлючТек;
				
				Если ЧислоСтолбцовВКлюче > 1 Тогда

					КлючТек = Ключ2;
					Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча2" + ИдентификаторБазы] Тогда
						Попытка
						    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча2" + ИдентификаторБазы];
						Исключение
							ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 2: """ + Ключ2 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
							Сообщить(ТекстОшибки);
						КонецПопытки;
					КонецЕсли;
					СтрокаПриемник.Ключ2 = КлючТек;
					
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда
					
					КлючТек = Ключ3;
					Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча3" + ИдентификаторБазы] Тогда
						Попытка
						    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча3" + ИдентификаторБазы];
						Исключение
							ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 3: """ + Ключ3 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
							Сообщить(ТекстОшибки);
						КонецПопытки;
					КонецЕсли;
					СтрокаПриемник.Ключ3 = КлючТек;
					
				КонецЕсли;
				
#КонецОбласти  

				ЗаполнитьПеременныеРЗначениямиПоУмолчанию();
				Для Каждого СтрокаНастроекФайла Из НастройкиФайла Цикл
					//Не задан номер колонки (например, если реквизит заполняется программно)
					Если СтрокаНастроекФайла.НомерКолонки = 0 Тогда
						Продолжить;
					КонецЕсли;
					ИмяРеквизита = "Реквизит" + СтрокаНастроекФайла.НомерСтроки;
					СтрокаПриемник[ИмяРеквизита] = ФайлDBF[ФайлDBF.поля[СтрокаНастроекФайла.НомерКолонки - 1].Имя];
					
					//Заполнение переменных, которые будут использоваться в произвольном коде
					РВрем = СтрокаПриемник[ИмяРеквизита];
					Если СтрокаНастроекФайла.НомерСтроки = 1 Тогда
						Р1 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 2 Тогда
						Р2 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 3 Тогда
						Р3 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 4 Тогда
						Р4 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 5 Тогда
						Р5 = РВрем;
					КонецЕсли;
					
				КонецЦикла;	
				
				ФайлDBF.Следующая();
							
			КонецЕсли;

#КонецОбласти


#Область Произвольный_код_заполнения_реквизитов
			
			Для Каждого СтрокаНастроекФайла Из НастройкиФайла Цикл
				
				ИмяРеквизита = "Реквизит" + СтрокаНастроекФайла.НомерСтроки;
				РТек = СтрокаПриемник[ИмяРеквизита];

				Попытка
					Выполнить СтрокаНастроекФайла.ПроизвольныйКод;
				Исключение
					ТекстОшибки = ОписаниеОшибки();
					Сообщить("Ошибка при выполнении произвольного кода (реквизит " + СтрокаНастроекФайла.НомерСтроки + "):" + ТекстОшибки);
				КонецПопытки;
				
				Если ЭтотОбъект["СворачиватьТаблицу" + ИдентификаторБазы] Тогда
					Попытка
						Выполнить КодПриведенияРеквизитаКТипуЧисло;
					Исключение
						РТек = 0;
					КонецПопытки;
				КонецЕсли;
				
				СтрокаПриемник[ИмяРеквизита] = РТек;
								
			КонецЦикла;
			
#КонецОбласти 

		КонецЦикла;

	КонецЕсли;
	
	Если ФорматФайла = "XLS" Тогда
		Книга.Close(0);
		Excel.Quit();
	ИначеЕсли ФорматФайла = "DOC" Тогда
		Документ.Close(0);
		Word.Quit();
	ИначеЕсли ФорматФайла = "DBF" Тогда
		ФайлDBF.ЗакрытьФайл();
	ИначеЕсли ФорматФайла = "XML" Тогда
		Парсер.Закрыть();
	КонецЕсли;
	
	Если ТЗ <> Неопределено Тогда
		
		//Индексирование
		ТЗ.Индексы.Добавить(КолонкиСКлючомСтрокой);
		
		Для СчетчикРеквизитов = 1 По ЭтотОбъект["НастройкиФайла" + ИдентификаторБазы].Количество() Цикл
			
			ИмяРеквизита = Строка(ИдентификаторБазы) + СчетчикРеквизитов;
			ЗаголовокРеквизитаИзНастроек = ЭтотОбъект["НастройкиФайла" + ИдентификаторБазы][СчетчикРеквизитов - 1].ЗаголовокРеквизитаДляПользователя;
			
			ПредставленияЗаголовковРеквизитов[ИмяРеквизита] = ?(ПустаяСтрока(ЗаголовокРеквизитаИзНастроек), "Реквизит " + ИдентификаторБазы + СчетчикРеквизитов, ИмяРеквизита + ": " + ЗаголовокРеквизитаИзНастроек);
		
		КонецЦикла;
		
	КонецЕсли;
	
	Возврат ТЗ;
	
КонецФункции

Функция ПрочитатьДанныеИзJSONИПолучитьТЗ(ИдентификаторБазы, ТекстОшибок = "")
	
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Ключ1");
	КолонкиСКлючомСтрокой = "Ключ1";
	
	Если ЧислоСтолбцовВКлюче > 1 Тогда
		ТЗ.Колонки.Добавить("Ключ2");
		КолонкиСКлючомСтрокой = КолонкиСКлючомСтрокой + ",Ключ2";
	КонецЕсли;
	
	Если ЧислоСтолбцовВКлюче > 2 Тогда
		ТЗ.Колонки.Добавить("Ключ3");
		КолонкиСКлючомСтрокой = КолонкиСКлючомСтрокой + ",Ключ3";
	КонецЕсли;
	
	ТЗ.Колонки.Добавить("Реквизит1");
	ТЗ.Колонки.Добавить("Реквизит2");
	ТЗ.Колонки.Добавить("Реквизит3");
	ТЗ.Колонки.Добавить("Реквизит4");
	ТЗ.Колонки.Добавить("Реквизит5");
	
	//ПутьКФайлу 			= ЭтотОбъект["ПодключениеКВнешнейБазе"		+ ИдентификаторБазы + "ПутьКФайлу"];
	//ФорматФайла 		= ЭтотОбъект["ПодключениеКВнешнейБазе" 		+ ИдентификаторБазы + "ФорматФайла"];
	//НомерПервойСтроки 	= ЭтотОбъект["НомерПервойСтрокиФайла" 		+ ИдентификаторБазы];
	НастройкиФайла 		= ЭтотОбъект["НастройкиФайла" 				+ ИдентификаторБазы];
	//НомерТаблицы		= ЭтотОбъект["ПодключениеКВнешнейБазе"		+ ИдентификаторБазы + "НомерТаблицыВФайле"];
	ИмяЭлементаСДаннымиФайла = ЭтотОбъект["ИмяЭлементаСДаннымиФайла" + ИдентификаторБазы];
	
	НомерСтолбцаСКлючом = ЭтотОбъект["НомерСтолбцаСКлючомИзФайла" 	+ ИдентификаторБазы];
	ИмяСтолбцаСКлючом 	= ЭтотОбъект["ИмяСтолбцаСКлючомИзФайла" 	+ ИдентификаторБазы];	
	Если ЧислоСтолбцовВКлюче > 1 Тогда
		НомерСтолбцаСКлючом2 	= ЭтотОбъект["НомерСтолбцаСКлючом2ИзФайла" + ИдентификаторБазы];
		ИмяСтолбцаСКлючом2 		= ЭтотОбъект["ИмяСтолбцаСКлючом2ИзФайла" + ИдентификаторБазы];
	КонецЕсли;	
	Если ЧислоСтолбцовВКлюче > 2 Тогда
		НомерСтолбцаСКлючом3 	= ЭтотОбъект["НомерСтолбцаСКлючом3ИзФайла" + ИдентификаторБазы];
		ИмяСтолбцаСКлючом3 		= ЭтотОбъект["ИмяСтолбцаСКлючом3ИзФайла" + ИдентификаторБазы];
	КонецЕсли;
	
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(ЭтотОбъект["ТекстЗапроса" + ИдентификаторБазы]);
	ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);
	ЧтениеJSON.Закрыть();
	
	ЭлементНайден = Ложь;
	Для каждого ТекущиеДанные Из ДанныеJSON Цикл
		
		//Массив с данными уже найден на предыдущей итерации
		Если ЭлементНайден Тогда 
			Прервать;
		КонецЕсли;
		
		Если СокрЛП(ВРег(ТекущиеДанные.Ключ1)) = СокрЛП(ВРег(ИмяЭлементаСДаннымиФайла)) И
			ТипЗнч(ТекущиеДанные.Значение) = Тип("Массив") Тогда
			
			ЭлементНайден = Истина;
			
			Для каждого ТекущееЗначениеJSON Из ТекущиеДанные.Значение Цикл
			
				ЗаполнитьПеременныеРЗначениямиПоУмолчанию();
										
				СтрокаПриемник = ТЗ.Добавить();
				
				Попытка				
					Если Не ТекущееЗначениеJSON.Свойство(ИмяСтолбцаСКлючом) Тогда
						ВызватьИсключение "Реквизит JSON с именем " + ИмяСтолбцаСКлючом + " не найден";
					КонецЕсли;
				Исключение
					ТекстОшибки = "Реквизит JSON с именем " + ИмяСтолбцаСКлючом + " не найден";
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					Возврат Неопределено;
				КонецПопытки; 
				
				Ключ1 = ТекущееЗначениеJSON[ИмяСтолбцаСКлючом];
				
				Если ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(ВРег(Строка(Ключ1)));
				КонецЕсли;
				Если ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
					Ключ1 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ1), "{", ""), "}", ""));
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 1 Тогда
				
					Попытка				
						Если Не ТекущееЗначениеJSON.Свойство(ИмяСтолбцаСКлючом2) Тогда
							ВызватьИсключение "Реквизит JSON с именем " + ИмяСтолбцаСКлючом2 + " не найден";
						КонецЕсли;
					Исключение
						ТекстОшибки = "Реквизит JSON с именем " + ИмяСтолбцаСКлючом2 + " не найден";
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
						Возврат Неопределено;
					КонецПопытки; 
					
					Ключ2 = ТекущееЗначениеJSON[ИмяСтолбцаСКлючом2];
							
					Если ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(Строка(Ключ2));
					КонецЕсли;
					
					Если ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(ВРег(Строка(Ключ2)));
					КонецЕсли;
					
					Если ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
						Ключ2 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ2), "{", ""), "}", ""));
					КонецЕсли;
												
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда
				
					Попытка				
						Если Не ТекущееЗначениеJSON.Свойство(ИмяСтолбцаСКлючом3) Тогда
							ВызватьИсключение "Реквизит JSON с именем " + ИмяСтолбцаСКлючом3 + " не найден";
						КонецЕсли;
					Исключение
						ТекстОшибки = "Реквизит JSON с именем " + ИмяСтолбцаСКлючом3 + " не найден";
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
						Возврат Неопределено;
					КонецПопытки; 
					
					Ключ3 = ТекущееЗначениеJSON[ИмяСтолбцаСКлючом3];
							
					Если ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы] Тогда
						Ключ3 = СокрЛП(Строка(Ключ3));
					КонецЕсли;
					
					Если ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] Тогда
						Ключ3 = СокрЛП(ВРег(Строка(Ключ3)));
					КонецЕсли;
					
					Если ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
						Ключ3 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ3), "{", ""), "}", ""));
					КонецЕсли;
					
				КонецЕсли;
					
#Область Произвольный_код_обработки_ключа

				КлючТек = Ключ1;
				Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча1" + ИдентификаторБазы] Тогда
					Попытка
					    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча1" + ИдентификаторБазы];
					Исключение
						ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 1: """ + Ключ1 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
						Сообщить(ТекстОшибки);
					КонецПопытки;
				КонецЕсли;
				
				СтрокаПриемник.Ключ1 = КлючТек;
				
				Если ЧислоСтолбцовВКлюче > 1 Тогда
					
					КлючТек = Ключ2;
					Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча2" + ИдентификаторБазы] Тогда
						Попытка
						    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча2" + ИдентификаторБазы];
						Исключение
							ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 2: """ + Ключ2 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
							Сообщить(ТекстОшибки);
						КонецПопытки;
					КонецЕсли;
					СтрокаПриемник.Ключ2 = КлючТек;
					
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда
					
					КлючТек = Ключ3;
					Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча3" + ИдентификаторБазы] Тогда
						Попытка
						    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча3" + ИдентификаторБазы];
						Исключение
							ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 3: """ + Ключ3 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
							Сообщить(ТекстОшибки);
						КонецПопытки;
					КонецЕсли;
					СтрокаПриемник.Ключ3 = КлючТек;
					
				КонецЕсли;
				
#КонецОбласти  

				ЗаполнитьПеременныеРЗначениямиПоУмолчанию();
				Для Каждого СтрокаНастроекФайла Из НастройкиФайла Цикл
					
					//Не задано имя колонки (например, если реквизит заполняется программно)
					Если ПустаяСтрока(СтрокаНастроекФайла.ИмяКолонки) Тогда
						Продолжить;
					КонецЕсли;
					
					ИмяРеквизита = "Реквизит" + СтрокаНастроекФайла.НомерСтроки;
					Попытка				
						Если Не ТекущееЗначениеJSON.Свойство(СтрокаНастроекФайла.ИмяКолонки) Тогда
							ВызватьИсключение "Реквизит JSON с именем " + СтрокаНастроекФайла.ИмяКолонки + " не найден";
						КонецЕсли;
					Исключение
						ТекстОшибки = "Реквизит JSON с именем " + СтрокаНастроекФайла.ИмяКолонки + " не найден";
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
						Возврат Неопределено;
					КонецПопытки; 
					
					СтрокаПриемник[ИмяРеквизита] = ТекущееЗначениеJSON[СтрокаНастроекФайла.ИмяКолонки];
										
					//Заполнение переменных, которые будут использоваться в произвольном коде
					РВрем = СтрокаПриемник[ИмяРеквизита];
					Если СтрокаНастроекФайла.НомерСтроки = 1 Тогда
						Р1 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 2 Тогда
						Р2 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 3 Тогда
						Р3 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 4 Тогда
						Р4 = РВрем;
					ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 5 Тогда
						Р5 = РВрем;
					КонецЕсли;

				КонецЦикла;
		
		
#Область Произвольный_код_заполнения_реквизитов
		
				Для Каждого СтрокаНастроекФайла Из НастройкиФайла Цикл
					
					ИмяРеквизита = "Реквизит" + СтрокаНастроекФайла.НомерСтроки;
					РТек = СтрокаПриемник[ИмяРеквизита];

					Попытка
						Выполнить СтрокаНастроекФайла.ПроизвольныйКод;
					Исключение
						ТекстОшибки = ОписаниеОшибки();
						Сообщить("Ошибка при выполнении произвольного кода (реквизит " + СтрокаНастроекФайла.НомерСтроки + "):" + ТекстОшибки);
					КонецПопытки;
					
					Если ЭтотОбъект["СворачиватьТаблицу" + ИдентификаторБазы] Тогда
						Попытка
							Выполнить КодПриведенияРеквизитаКТипуЧисло;
						Исключение
							РТек = 0;
						КонецПопытки;
					КонецЕсли;
				
					СтрокаПриемник[ИмяРеквизита] = РТек;
				
				КонецЦикла;
													
			КонецЦикла;
		
		КонецЕсли;
	
#КонецОбласти 

	КонецЦикла;
	
	Если ТЗ <> Неопределено Тогда
		
		//Индексирование
		ТЗ.Индексы.Добавить(КолонкиСКлючомСтрокой);
		
		Для СчетчикРеквизитов = 1 По ЭтотОбъект["НастройкиФайла" + ИдентификаторБазы].Количество() Цикл
			
			ИмяРеквизита = Строка(ИдентификаторБазы) + СчетчикРеквизитов;
			ЗаголовокРеквизитаИзНастроек = ЭтотОбъект["НастройкиФайла" + ИдентификаторБазы][СчетчикРеквизитов - 1].ЗаголовокРеквизитаДляПользователя;
			
			ПредставленияЗаголовковРеквизитов[ИмяРеквизита] = ?(ПустаяСтрока(ЗаголовокРеквизитаИзНастроек), "Реквизит " + ИдентификаторБазы + СчетчикРеквизитов, ИмяРеквизита + ": " + ЗаголовокРеквизитаИзНастроек);
		
		КонецЦикла;
		
	КонецЕсли;
	
	Возврат ТЗ;
	
КонецФункции

Функция ПолучитьДанныеИзТабличногоДокумента(ИдентификаторБазы, ТекстОшибок = "")
	
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Ключ1");
	КолонкиСКлючомСтрокой = "Ключ1";
	
	Если ЧислоСтолбцовВКлюче > 1 Тогда
		ТЗ.Колонки.Добавить("Ключ2");
		КолонкиСКлючомСтрокой = КолонкиСКлючомСтрокой + ",Ключ2";
	КонецЕсли;
	
	Если ЧислоСтолбцовВКлюче > 2 Тогда
		ТЗ.Колонки.Добавить("Ключ3");
		КолонкиСКлючомСтрокой = КолонкиСКлючомСтрокой + ",Ключ3";
	КонецЕсли;
	
	ТЗ.Колонки.Добавить("Реквизит1");
	ТЗ.Колонки.Добавить("Реквизит2");
	ТЗ.Колонки.Добавить("Реквизит3");
	ТЗ.Колонки.Добавить("Реквизит4");
	ТЗ.Колонки.Добавить("Реквизит5");
	
	НомерПервойСтроки 	= ЭтотОбъект["НомерПервойСтрокиФайла" + ИдентификаторБазы];
	НастройкиФайла 		= ЭтотОбъект["НастройкиФайла" + ИдентификаторБазы];
	
	НомерСтолбцаСКлючом = ЭтотОбъект["НомерСтолбцаСКлючомИзФайла" + ИдентификаторБазы];
	Если ЧислоСтолбцовВКлюче > 1 Тогда
		НомерСтолбцаСКлючом2 = ЭтотОбъект["НомерСтолбцаСКлючом2ИзФайла" + ИдентификаторБазы];
	КонецЕсли;
	Если ЧислоСтолбцовВКлюче > 2 Тогда
		НомерСтолбцаСКлючом3 = ЭтотОбъект["НомерСтолбцаСКлючом3ИзФайла" + ИдентификаторБазы];
	КонецЕсли;
	
	НомерТекущейСтроки = НомерПервойСтроки;	
	ТекущееЧислоСтрокСПустымиКлючами = 0;
	Пока Истина Цикл
		
		Ключ1 = ЭтотОбъект["Таблица" + ИдентификаторБазы].Область(НомерТекущейСтроки,НомерСтолбцаСКлючом,НомерТекущейСтроки,НомерСтолбцаСКлючом).Текст;
								
		Если ЭтотОбъект["ПриводитьКлючКСтроке" + ИдентификаторБазы] Тогда
			Ключ1 = СокрЛП(Строка(Ключ1));
		КонецЕсли;
		
		Если ЭтотОбъект["ПриводитьКлючКВерхнемуРегистру" + ИдентификаторБазы] Тогда
			Ключ1 = СокрЛП(ВРег(Строка(Ключ1)));
		КонецЕсли;
		
		Если ЭтотОбъект["УдалятьИзКлючаФигурныеСкобки" + ИдентификаторБазы] Тогда
			Ключ1 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ1), "{", ""), "}", ""));
		КонецЕсли;
						
		Если ЧислоСтолбцовВКлюче > 1 Тогда
			
			Ключ2 = ЭтотОбъект["Таблица" + ИдентификаторБазы].Область(НомерТекущейСтроки,НомерСтолбцаСКлючом2,НомерТекущейСтроки,НомерСтолбцаСКлючом2).Текст;
					
			Если ЭтотОбъект["ПриводитьКлюч2КСтроке" + ИдентификаторБазы] Тогда
				Ключ2 = СокрЛП(Строка(Ключ2));
			КонецЕсли;
			
			Если ЭтотОбъект["ПриводитьКлюч2КВерхнемуРегистру" + ИдентификаторБазы] Тогда
				Ключ2 = СокрЛП(ВРег(Строка(Ключ2)));
			КонецЕсли;
			
			Если ЭтотОбъект["УдалятьИзКлюча2ФигурныеСкобки" + ИдентификаторБазы] Тогда
				Ключ2 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ2), "{", ""), "}", ""));
			КонецЕсли;
						
		КонецЕсли;
		
		Если ЧислоСтолбцовВКлюче > 2 Тогда
			
			Ключ3 = ЭтотОбъект["Таблица" + ИдентификаторБазы].Область(НомерТекущейСтроки,НомерСтолбцаСКлючом3,НомерТекущейСтроки,НомерСтолбцаСКлючом3).Текст;
					
			Если ЭтотОбъект["ПриводитьКлюч3КСтроке" + ИдентификаторБазы] Тогда
				Ключ3 = СокрЛП(Строка(Ключ3));
			КонецЕсли;
			
			Если ЭтотОбъект["ПриводитьКлюч3КВерхнемуРегистру" + ИдентификаторБазы] Тогда
				Ключ3 = СокрЛП(ВРег(Строка(Ключ3)));
			КонецЕсли;
			
			Если ЭтотОбъект["УдалятьИзКлюча3ФигурныеСкобки" + ИдентификаторБазы] Тогда
				Ключ3 = СокрЛП(СтрЗаменить(СтрЗаменить(Строка(Ключ3), "{", ""), "}", ""));
			КонецЕсли;
						
		КонецЕсли;
						
		Если Не ЗначениеЗаполнено(Ключ1) Тогда
			Если ЧислоСтолбцовВКлюче > 1 Тогда
				Если Не ЗначениеЗаполнено(Ключ2) Тогда
					Если ЧислоСтолбцовВКлюче > 2 Тогда
						Если Не ЗначениеЗаполнено(Ключ3) Тогда
							ТекущееЧислоСтрокСПустымиКлючами = ТекущееЧислоСтрокСПустымиКлючами + 1;
						КонецЕсли;
					Иначе
						ТекущееЧислоСтрокСПустымиКлючами = ТекущееЧислоСтрокСПустымиКлючами + 1;
					КонецЕсли;
				КонецЕсли;
			Иначе
				ТекущееЧислоСтрокСПустымиКлючами = ТекущееЧислоСтрокСПустымиКлючами + 1;
			КонецЕсли;
		Иначе
			ТекущееЧислоСтрокСПустымиКлючами = 0;
		КонецЕсли;
		
		Если ТекущееЧислоСтрокСПустымиКлючами = ЧислоСтрокСПустымиКлючамиДляПрерыванияЧтения Тогда
			Прервать;
		КонецЕсли;
		
		ЗаполнитьПеременныеРЗначениямиПоУмолчанию();
		
		СтрокаПриемник = ТЗ.Добавить();
		
#Область Произвольный_код_обработки_ключа
	
		КлючТек = Ключ1;
		Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча1" + ИдентификаторБазы] Тогда
			Попытка
			    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча1" + ИдентификаторБазы];
			Исключение
				ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 1: """ + Ключ1 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
				Сообщить(ТекстОшибки);
			КонецПопытки;
		КонецЕсли;
		СтрокаПриемник.Ключ1 = КлючТек;
		
		Если ЧислоСтолбцовВКлюче > 1 Тогда
			
			КлючТек = Ключ2;
			Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча2" + ИдентификаторБазы] Тогда
				Попытка
				    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча2" + ИдентификаторБазы];
				Исключение
					ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 2: """ + Ключ2 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
					Сообщить(ТекстОшибки);
				КонецПопытки;
			КонецЕсли;
			СтрокаПриемник.Ключ2 = КлючТек;
			
		КонецЕсли;
		
		Если ЧислоСтолбцовВКлюче > 2 Тогда
			
			КлючТек = Ключ3;
			Если ЭтотОбъект["ВыполнятьПроизвольныйКодКлюча3" + ИдентификаторБазы] Тогда
				Попытка
				    Выполнить ЭтотОбъект["ПроизвольныйКодКлюча3" + ИдентификаторБазы];
				Исключение
					ТекстОшибки = "Ошибка при выполнении произвольного кода (ключ 3: """ + Ключ3 + """) источника " + ИдентификаторБазы + ": " + ОписаниеОшибки();
					Сообщить(ТекстОшибки);
				КонецПопытки;
			КонецЕсли;
			СтрокаПриемник.Ключ3 = КлючТек;
			
		КонецЕсли;
		
#КонецОбласти 
		
		Для Каждого СтрокаНастроекФайла Из НастройкиФайла Цикл
		
			ИмяРеквизита = "Реквизит" + СтрокаНастроекФайла.НомерСтроки;
			СтрокаПриемник[ИмяРеквизита] = СокрЛП(ЭтотОбъект["Таблица" + ИдентификаторБазы].Область(НомерТекущейСтроки,СтрокаНастроекФайла.НомерКолонки,НомерТекущейСтроки,СтрокаНастроекФайла.НомерКолонки).Текст);
			
			//Заполнение переменных, которые будут использоваться в произвольном коде
			РВрем = СтрокаПриемник[ИмяРеквизита];
			Если СтрокаНастроекФайла.НомерСтроки = 1 Тогда
				Р1 = РВрем;
			ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 2 Тогда
				Р2 = РВрем;
			ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 3 Тогда
				Р3 = РВрем;
			ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 4 Тогда
				Р4 = РВрем;
			ИначеЕсли СтрокаНастроекФайла.НомерСтроки = 5 Тогда
				Р5 = РВрем;
			КонецЕсли;	
			
		КонецЦикла;
		
		Для Каждого СтрокаНастроекФайла Из НастройкиФайла Цикл
				
			ИмяРеквизита = "Реквизит" + СтрокаНастроекФайла.НомерСтроки;
			РТек = СтрокаПриемник[ИмяРеквизита];

			Попытка
				Выполнить СтрокаНастроекФайла.ПроизвольныйКод;
			Исключение
				ТекстОшибки = ОписаниеОшибки();
				Сообщить("Ошибка при выполнении произвольного кода (реквизит " + СтрокаНастроекФайла.НомерСтроки + "):" + ТекстОшибки);
			КонецПопытки;
			
			Если ЭтотОбъект["СворачиватьТаблицу" + ИдентификаторБазы] Тогда
				Попытка
					Выполнить КодПриведенияРеквизитаКТипуЧисло;
				Исключение
					РТек = 0;
				КонецПопытки;
			КонецЕсли;
			
			СтрокаПриемник[ИмяРеквизита] = РТек;
							
		КонецЦикла;
		
		НомерТекущейСтроки = НомерТекущейСтроки + 1;
		
	КонецЦикла;
	
	Если ТЗ <> Неопределено Тогда
		
		//Индексирование
		ТЗ.Индексы.Добавить(КолонкиСКлючомСтрокой);
		
		Для СчетчикРеквизитов = 1 По ЭтотОбъект["НастройкиФайла" + ИдентификаторБазы].Количество() Цикл
			
			ИмяРеквизита = Строка(ИдентификаторБазы) + СчетчикРеквизитов;
			ЗаголовокРеквизитаИзНастроек = ЭтотОбъект["НастройкиФайла" + ИдентификаторБазы][СчетчикРеквизитов - 1].ЗаголовокРеквизитаДляПользователя;
			
			ПредставленияЗаголовковРеквизитов[ИмяРеквизита] = ?(ПустаяСтрока(ЗаголовокРеквизитаИзНастроек), "Реквизит " + ИдентификаторБазы + СчетчикРеквизитов, ИмяРеквизита + ": " + ЗаголовокРеквизитаИзНастроек);
		
		КонецЦикла;
		
	КонецЕсли;
	
	Возврат ТЗ;
	
КонецФункции

Функция ПроверитьВозможностьПодключенияКИсточнику(ИдентификаторБазы, ТекстОшибок) Экспорт
	
	//Внешняя база 1С 8
	Если ЭтотОбъект["ТипБазы" + ИдентификаторБазы] = 1 Тогда
		 ПодключениеВыполненоУспешно = ПроверитьВозможностьПодключенияКВнешейБазе1С8(ИдентификаторБазы, ТекстОшибок);
	//SQL
	ИначеЕсли ЭтотОбъект["ТипБазы" + ИдентификаторБазы] = 2 Тогда
		ПодключениеВыполненоУспешно = ПроверитьВозможностьПодключенияКБазеДанныхSQL(ИдентификаторБазы, ТекстОшибок);
	Иначе
		ПодключениеВыполненоУспешно = Ложь;
		ТекстОшибок = ТекстОшибок + Символы.ПС + "Возможность тестирования корретности подключения к источнику выбранного типа не реализована в текущей версии обработки КСД.";
	КонецЕсли;
	
	Возврат ПодключениеВыполненоУспешно;
	
КонецФункции
#КонецОбласти


#Область Вспомогательные_процедуры_и_функции
Функция ПроверитьЗаполнениеРеквизитов(ИсточникДляПредварительногоПросмотра = "", ТекстОшибок = "") Экспорт
	
	РеквизитыЗаполненыКорректно = Истина;
	
	Если ЧислоСтолбцовВКлюче = 0 Тогда
		РеквизитыЗаполненыКорректно = Ложь;
		ТекстОшибки = "Не заполнено число столбцов в ключе";
		СообщениеПользователю = Новый СообщениеПользователю;
		СообщениеПользователю.Текст = ТекстОшибки;
		СообщениеПользователю.Поле = "Объект.ЧислоСтолбцовВКлюче";
		СообщениеПользователю.Сообщить();
		ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
	КонецЕсли;
		
	Если ЧислоСтрокСПустымиКлючамиДляПрерыванияЧтения = 0 Тогда
		РеквизитыЗаполненыКорректно = Ложь;
		ТекстОшибки = "Не заполнено число строк с пустыми ключами для прерывания чтения";
		СообщениеПользователю = Новый СообщениеПользователю;
		СообщениеПользователю.Текст = ТекстОшибки;
		СообщениеПользователю.Поле = "Объект.ЧислоСтрокСПустымиКлючамиДляПрерыванияЧтения";
		СообщениеПользователю.Сообщить();
		ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
	КонецЕсли;
	
#Область _1С_8_1С_77_SQL

	Если ПустаяСтрока(ИсточникДляПредварительногоПросмотра) Или ИсточникДляПредварительногоПросмотра = "А" Тогда
	
		Если ТипБазыА >= 0 И ТипБазыА <= 2 Или ТипБазыА = 5 Тогда
			
			Если ПустаяСтрока(ТекстЗапросаА) Тогда
				РеквизитыЗаполненыКорректно = Ложь;
				ТекстОшибки = "Не заполнен текст запроса к базе А";
				СообщениеПользователю = Новый СообщениеПользователю;
				СообщениеПользователю.Текст = ТекстОшибки;
				СообщениеПользователю.Поле = "Объект.ТекстЗапросаА";
				СообщениеПользователю.Сообщить();
				ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Если ПустаяСтрока(ИсточникДляПредварительногоПросмотра) Или ИсточникДляПредварительногоПросмотра = "Б" Тогда
		
		Если ТипБазыБ >= 0 И ТипБазыБ <= 2 Или ТипБазыБ = 5 Тогда
		
			Если ПустаяСтрока(ТекстЗапросаБ) Тогда
				РеквизитыЗаполненыКорректно = Ложь;
				ТекстОшибки = "Не заполнен текст запроса к базе Б";
				СообщениеПользователю = Новый СообщениеПользователю;
				СообщениеПользователю.Текст = ТекстОшибки;
				СообщениеПользователю.Поле = "Объект.ТекстЗапросаБ";
				СообщениеПользователю.Сообщить();
				ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
#КонецОбласти 


#Область Файл_Табличный_документ

	Если ПустаяСтрока(ИсточникДляПредварительногоПросмотра) Или ИсточникДляПредварительногоПросмотра = "А" Тогда
	
		Если ТипБазыА = 3 Или ТипБазыА = 4 Тогда
				
			Если ТипБазыА = 3 И ПустаяСтрока(ПодключениеКВнешнейБазеАФорматФайла) Тогда
				
				РеквизитыЗаполненыКорректно = Ложь;
				ТекстОшибки = "Не заполнен формат файла А";
				СообщениеПользователю = Новый СообщениеПользователю;
				СообщениеПользователю.Текст = ТекстОшибки;
				СообщениеПользователю.Поле = "Объект.ПодключениеКВнешнейБазеАФорматФайла";
				СообщениеПользователю.Сообщить();
				ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				
			ИначеЕсли ТипБазыА = 3 И ПодключениеКВнешнейБазеАФорматФайла = "XML" Тогда
				
				Если ПустаяСтрока(ИмяСтолбцаСКлючомИзФайлаА) Тогда
				
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнено имя столбца с ключом файла А";
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.ИмяСтолбцаСКлючомИзФайлаА";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				
				КонецЕсли; 
				
				Если ЧислоСтолбцовВКлюче > 1 Тогда
				
					Если ИмяСтолбцаСКлючом2ИзФайлаА = 0 Тогда
						
						РеквизитыЗаполненыКорректно = Ложь;
						ТекстОшибки = "Не заполнено имя столбца с ключом 2 файла А";
						СообщениеПользователю = Новый СообщениеПользователю;
						СообщениеПользователю.Текст = ТекстОшибки;
						СообщениеПользователю.Поле = "Объект.ИмяСтолбцаСКлючом2ИзФайлаА";
						СообщениеПользователю.Сообщить();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
						
					КонецЕсли;
					
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда
				
					Если ИмяСтолбцаСКлючом3ИзФайлаА = 0 Тогда
						
						РеквизитыЗаполненыКорректно = Ложь;
						ТекстОшибки = "Не заполнено имя столбца с ключом 3 файла А";
						СообщениеПользователю = Новый СообщениеПользователю;
						СообщениеПользователю.Текст = ТекстОшибки;
						СообщениеПользователю.Поле = "Объект.ИмяСтолбцаСКлючом3ИзФайлаА";
						СообщениеПользователю.Сообщить();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
						
					КонецЕсли;
					
				КонецЕсли;
				
				Если ПустаяСтрока(СпособХраненияДанныхВXMLФайлеА) Тогда
				
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнен способ хранения данных в файле А";
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.СпособХраненияДанныхВXMLФайлеА";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				
				КонецЕсли;
			
			Иначе
				
				//Для файлов xls и doc должен быть указан номер книги /таблицы
				Если ТипБазыА = 3 И (ПодключениеКВнешнейБазеАФорматФайла = "XLS" Или ПодключениеКВнешнейБазеАФорматФайла = "DOC") Тогда
					
					Если ПодключениеКВнешнейБазеАНомерТаблицыВФайле = 0 Тогда
						РеквизитыЗаполненыКорректно = Ложь;
						ТекстОшибки = "Не заполнен номер " + ?(ПодключениеКВнешнейБазеАФорматФайла = "XLS", "книги", "таблицы") + " файла А";
						СообщениеПользователю = Новый СообщениеПользователю;
						СообщениеПользователю.Текст = ТекстОшибки;
						СообщениеПользователю.Поле = "Объект.ПодключениеКВнешнейБазеАНомерТаблицыВФайле";
						СообщениеПользователю.Сообщить();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					КонецЕсли;
					
				КонецЕсли;
				
				Если НомерПервойСтрокиФайлаА = 0 Тогда
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнен номер первой строки файла/таблицы А";
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.НомерПервойСтрокиФайлаА";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				КонецЕсли;
				
				Если НомерСтолбцаСКлючомИзФайлаА = 0 Тогда
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнен номер столбца с ключом файла/таблицы А";
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.НомерСтолбцаСКлючомИзФайлаА";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 1 Тогда			
					Если НомерСтолбцаСКлючом2ИзФайлаА = 0 Тогда
						РеквизитыЗаполненыКорректно = Ложь;
						ТекстОшибки = "Не заполнен номер столбца с ключом 2 файла/таблицы А";
						СообщениеПользователю = Новый СообщениеПользователю;
						СообщениеПользователю.Текст = ТекстОшибки;
						СообщениеПользователю.Поле = "Объект.НомерСтолбцаСКлючом2ИзФайлаА";
						СообщениеПользователю.Сообщить();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;					
					КонецЕсли;			
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда			
					Если НомерСтолбцаСКлючом3ИзФайлаА = 0 Тогда
						РеквизитыЗаполненыКорректно = Ложь;
						ТекстОшибки = "Не заполнен номер столбца с ключом 3 файла/таблицы А";
						СообщениеПользователю = Новый СообщениеПользователю;
						СообщениеПользователю.Текст = ТекстОшибки;
						СообщениеПользователю.Поле = "Объект.НомерСтолбцаСКлючом3ИзФайлаА";
						СообщениеПользователю.Сообщить();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;					
					КонецЕсли;			
				КонецЕсли; 
				
				Для Каждого СтрокаТЧ Из НастройкиФайлаА Цикл
					Если ПустаяСтрока(СтрокаТЧ.ПроизвольныйКод) И СтрокаТЧ.НомерКолонки = 0 Тогда
						РеквизитыЗаполненыКорректно = Ложь;
						ТекстОшибки = "Не заполнен номер колонки файла/таблицы А, соответствующий реквизиту А" + СтрокаТЧ.НомерСтроки;
						СообщениеПользователю = Новый СообщениеПользователю;
						СообщениеПользователю.Текст = ТекстОшибки;
						СообщениеПользователю.Поле = "Объект.НастройкиФайлаА[" + (СтрокаТЧ.НомерСтроки - 1) + "].НомерКолонки";
						СообщениеПользователю.Сообщить();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					КонецЕсли;
				КонецЦикла;
				
			КонецЕсли; 
			
		КонецЕсли;
		
	КонецЕсли; 
	
	Если ПустаяСтрока(ИсточникДляПредварительногоПросмотра) Или ИсточникДляПредварительногоПросмотра = "Б" Тогда
		Если ТипБазыБ = 3 Или ТипБазыБ = 4 Тогда
				
			Если ТипБазыБ = 3 И ПустаяСтрока(ПодключениеКВнешнейБазеБФорматФайла) Тогда
				
				РеквизитыЗаполненыКорректно = Ложь;
				ТекстОшибки = "Не заполнен формат файла Б";
				СообщениеПользователю = Новый СообщениеПользователю;
				СообщениеПользователю.Текст = ТекстОшибки;
				СообщениеПользователю.Поле = "Объект.ПодключениеКВнешнейБазеБФорматФайла";
				СообщениеПользователю.Сообщить();
				ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				
			ИначеЕсли ТипБазыБ = 3 И ПодключениеКВнешнейБазеБФорматФайла = "XML" Тогда

				Если ПустаяСтрока(ИмяСтолбцаСКлючомИзФайлаБ) Тогда
				
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнено имя столбца с ключом файла Б";
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.ИмяСтолбцаСКлючомИзФайлаБ";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 1 Тогда			
					Если ИмяСтолбцаСКлючом2ИзФайлаБ = 0 Тогда					
						РеквизитыЗаполненыКорректно = Ложь;
						ТекстОшибки = "Не заполнено имя столбца с ключом 2 файла Б";
						СообщениеПользователю = Новый СообщениеПользователю;
						СообщениеПользователю.Текст = ТекстОшибки;
						СообщениеПользователю.Поле = "Объект.ИмяСтолбцаСКлючом2ИзФайлаБ";
						СообщениеПользователю.Сообщить();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;					
					КонецЕсли;				
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда			
					Если ИмяСтолбцаСКлючом3ИзФайлаБ = 0 Тогда					
						РеквизитыЗаполненыКорректно = Ложь;
						ТекстОшибки = "Не заполнено имя столбца с ключом 3 файла Б";
						СообщениеПользователю = Новый СообщениеПользователю;
						СообщениеПользователю.Текст = ТекстОшибки;
						СообщениеПользователю.Поле = "Объект.ИмяСтолбцаСКлючом3ИзФайлаБ";
						СообщениеПользователю.Сообщить();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;					
					КонецЕсли;				
				КонецЕсли;
				
				Если ПустаяСтрока(СпособХраненияДанныхВXMLФайлеБ) Тогда
				
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнен способ хранения данных в файле Б";
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.СпособХраненияДанныхВXMLФайлеБ";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				
				КонецЕсли;
				
			Иначе
				
				Если ТипБазыБ = 3 И (ПодключениеКВнешнейБазеБФорматФайла = "XLS" Или ПодключениеКВнешнейБазеБФорматФайла = "DOC") Тогда
					
					//Для файлов xls и doc должен быть указан номер книги /таблицы
					Если ПодключениеКВнешнейБазеБНомерТаблицыВФайле = 0 Тогда
						РеквизитыЗаполненыКорректно = Ложь;
						ТекстОшибки = "Не заполнен номер " + ?(ПодключениеКВнешнейБазеБФорматФайла = "XLS", "книги", "таблицы") + " файла А";
						СообщениеПользователю = Новый СообщениеПользователю;
						СообщениеПользователю.Текст = ТекстОшибки;
						СообщениеПользователю.Поле = "Объект.ПодключениеКВнешнейБазеБНомерТаблицыВФайле";
						СообщениеПользователю.Сообщить();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					КонецЕсли;
				КонецЕсли;
				
				Если НомерПервойСтрокиФайлаБ = 0 Тогда
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнен номер первой строки файла/таблицы Б";
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.НомерПервойСтрокиФайлаБ";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				КонецЕсли;
				
				Если НомерСтолбцаСКлючомИзФайлаБ = 0 Тогда
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнен номер столбца с ключом файла/таблицы Б";
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.НомерСтолбцаСКлючомИзФайлаБ";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 1 Тогда
				
					Если НомерСтолбцаСКлючом2ИзФайлаБ = 0 Тогда
						
						РеквизитыЗаполненыКорректно = Ложь;
						ТекстОшибки = "Не заполнен номер столбца с ключом 2 файла/таблицы Б";
						СообщениеПользователю = Новый СообщениеПользователю;
						СообщениеПользователю.Текст = ТекстОшибки;
						СообщениеПользователю.Поле = "Объект.НомерСтолбцаСКлючом2ИзФайлаБ";
						СообщениеПользователю.Сообщить();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
						
					КонецЕсли;
				
				КонецЕсли;
				
				Если ЧислоСтолбцовВКлюче > 2 Тогда
				
					Если НомерСтолбцаСКлючом3ИзФайлаБ = 0 Тогда
						
						РеквизитыЗаполненыКорректно = Ложь;
						ТекстОшибки = "Не заполнен номер столбца с ключом 3 файла/таблицы Б";
						СообщениеПользователю = Новый СообщениеПользователю;
						СообщениеПользователю.Текст = ТекстОшибки;
						СообщениеПользователю.Поле = "Объект.НомерСтолбцаСКлючом3ИзФайлаБ";
						СообщениеПользователю.Сообщить();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
						
					КонецЕсли;
				
				КонецЕсли;
				
				Для Каждого СтрокаТЧ Из НастройкиФайлаБ Цикл
					Если ПустаяСтрока(СтрокаТЧ.ПроизвольныйКод) И СтрокаТЧ.НомерКолонки = 0 Тогда
						РеквизитыЗаполненыКорректно = Ложь;
						ТекстОшибки = "Не заполнен номер колонки файла/таблицы Б, соответствующий реквизиту Б" + СтрокаТЧ.НомерСтроки;
						СообщениеПользователю = Новый СообщениеПользователю;
						СообщениеПользователю.Текст = ТекстОшибки;
						СообщениеПользователю.Поле = "Объект.НастройкиФайлаБ[" + (СтрокаТЧ.НомерСтроки - 1) + "].НомерКолонки";
						СообщениеПользователю.Сообщить();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					КонецЕсли;
				КонецЦикла;
				
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
#КонецОбласти 


 #Область JSON
 
	 Если ПустаяСтрока(ИсточникДляПредварительногоПросмотра) Или ИсточникДляПредварительногоПросмотра = "А" Тогда
		 
	 	Если ТипБазыА = 6 Тогда
		 
			Если ПустаяСтрока(ТекстЗапросаА) Тогда
				РеквизитыЗаполненыКорректно = Ложь;
				ТекстОшибки = "Не заполнена строка JSON";
				СообщениеПользователю = Новый СообщениеПользователю;
				СообщениеПользователю.Текст = ТекстОшибки;
				СообщениеПользователю.Поле = "Объект.ТекстЗапросаА";
				СообщениеПользователю.Сообщить();
				ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			КонецЕсли;
						
			Если ПустаяСтрока(ИмяСтолбцаСКлючомИзФайлаА) Тогда
					
				РеквизитыЗаполненыКорректно = Ложь;
				ТекстОшибки = "Не заполнено имя столбца с ключом файла А";
				СообщениеПользователю = Новый СообщениеПользователю;
				СообщениеПользователю.Текст = ТекстОшибки;
				СообщениеПользователю.Поле = "Объект.ИмяСтолбцаСКлючомИзФайлаА";
				СообщениеПользователю.Сообщить();
				ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			
			КонецЕсли; 
			
			Если ЧислоСтолбцовВКлюче > 1 Тогда
			
				Если ИмяСтолбцаСКлючом2ИзФайлаА = 0 Тогда
					
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнено имя столбца с ключом 2 файла А";
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.ИмяСтолбцаСКлючом2ИзФайлаА";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					
				КонецЕсли;
				
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
			
				Если ИмяСтолбцаСКлючом3ИзФайлаА = 0 Тогда
					
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнено имя столбца с ключом 3 файла А";
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.ИмяСтолбцаСКлючом3ИзФайлаА";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					
				КонецЕсли;
				
			КонецЕсли; 
			
		КонецЕсли;
			
	КонецЕсли;
	
	
	Если ПустаяСтрока(ИсточникДляПредварительногоПросмотра) Или ИсточникДляПредварительногоПросмотра = "Б" Тогда
			
		Если ТипБазыБ = 6 Тогда
		 
			Если ПустаяСтрока(ТекстЗапросаБ) Тогда
				РеквизитыЗаполненыКорректно = Ложь;
				ТекстОшибки = "Не заполнена строка JSON";
				СообщениеПользователю = Новый СообщениеПользователю;
				СообщениеПользователю.Текст = ТекстОшибки;
				СообщениеПользователю.Поле = "Объект.ТекстЗапросаБ";
				СообщениеПользователю.Сообщить();
				ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			КонецЕсли;
			
			Если ПустаяСтрока(ИмяСтолбцаСКлючомИзФайлаБ) Тогда
					
				РеквизитыЗаполненыКорректно = Ложь;
				ТекстОшибки = "Не заполнено имя столбца с ключом файла Б";
				СообщениеПользователю = Новый СообщениеПользователю;
				СообщениеПользователю.Текст = ТекстОшибки;
				СообщениеПользователю.Поле = "Объект.ИмяСтолбцаСКлючомИзФайлаБ";
				СообщениеПользователю.Сообщить();
				ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			
			КонецЕсли; 
			
			Если ЧислоСтолбцовВКлюче > 1 Тогда
			
				Если ИмяСтолбцаСКлючом2ИзФайлаБ = 0 Тогда
					
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнено имя столбца с ключом 2 файла Б";
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.ИмяСтолбцаСКлючом2ИзФайлаБ";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					
				КонецЕсли;
				
			КонецЕсли;
			
			Если ЧислоСтолбцовВКлюче > 2 Тогда
			
				Если ИмяСтолбцаСКлючом3ИзФайлаБ = 0 Тогда
					
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнено имя столбца с ключом 3 файла Б";
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.ИмяСтолбцаСКлючом3ИзФайлаБ";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					
				КонецЕсли;
				
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
 #КонецОбласти 

 	Если ПустаяСтрока(ИсточникДляПредварительногоПросмотра) Тогда
	 
		//Если код формируется автоматически, поля таблиц условий д.б. заполнены правильно
		Если Не КодДляВыводаСтрокРедактируетсяВручную И Не УсловияВыводаСтрокОтключены Тогда
			
			Если УсловияВыводаСтрок.Количество() > 1 И Не ЗначениеЗаполнено(ЛогическийОператорДляУсловийВыводаСтрок) Тогда
				РеквизитыЗаполненыКорректно = Ложь;
				ТекстОшибки = "Не заполнен логический оператор для объединения условий вывода строк";
				СообщениеПользователю = Новый СообщениеПользователю;
				СообщениеПользователю.Текст = ТекстОшибки;
				СообщениеПользователю.Поле = "Объект.ЛогическийОператорДляУсловийВыводаСтрок";
				СообщениеПользователю.Сообщить();
				ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			КонецЕсли;
			
			Для Каждого СтрокаТЧ Из УсловияВыводаСтрок Цикл
				
				Если Не ЗначениеЗаполнено(СтрокаТЧ.ИмяСравниваемогоРеквизита) Тогда
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнено имя реквизита в строке условий вывода №" + СтрокаТЧ.НомерСтроки;
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.УсловияВыводаСтрок[" + (СтрокаТЧ.НомерСтроки - 1) + "].ИмяСравниваемогоРеквизита";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				КонецЕсли;
				
				Если Не ЗначениеЗаполнено(СтрокаТЧ.Условие) Тогда
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнено условие в строке условий вывода №" + СтрокаТЧ.НомерСтроки;
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.УсловияВыводаСтрок[" + (СтрокаТЧ.НомерСтроки - 1) + "].Условие";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				КонецЕсли;
				
				Если Не ЗначениеЗаполнено(СтрокаТЧ.ТипСравнения) Тогда
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнен тип сравнения в строке условий вывода №" + СтрокаТЧ.НомерСтроки;
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.УсловияВыводаСтрок[" + (СтрокаТЧ.НомерСтроки - 1) + "].ТипСравнения";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				КонецЕсли;
				
				Если СтрокаТЧ.Условие <> "Заполнен" Тогда
				
					Если СтрокаТЧ.ТипСравнения = "Реквизит" И Не ЗначениеЗаполнено(СтрокаТЧ.ИмяСравниваемогоРеквизита2) Тогда
						РеквизитыЗаполненыКорректно = Ложь;
						ТекстОшибки = "Не заполнено имя реквизита в строке условий вывода №" + СтрокаТЧ.НомерСтроки;
						СообщениеПользователю = Новый СообщениеПользователю;
						СообщениеПользователю.Текст = ТекстОшибки;
						СообщениеПользователю.Поле = "Объект.УсловияВыводаСтрок[" + (СтрокаТЧ.НомерСтроки - 1) + "].ИмяСравниваемогоРеквизита2";
						СообщениеПользователю.Сообщить();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					КонецЕсли;
					
				КонецЕсли;
				
			КонецЦикла;
			
		КонецЕсли;     
			
		Если Не КодДляЗапретаВыводаСтрокРедактируетсяВручную И Не УсловияЗапретаВыводаСтрокОтключены Тогда
			
			Если УсловияЗапретаВыводаСтрок.Количество() > 1 И Не ЗначениеЗаполнено(ЛогическийОператорДляУсловийЗапретаВыводаСтрок) Тогда
				РеквизитыЗаполненыКорректно = Ложь;
				ТекстОшибки = "Не заполнен логический оператор для объединения условий запрета вывода строк";
				СообщениеПользователю = Новый СообщениеПользователю;
				СообщениеПользователю.Текст = ТекстОшибки;
				СообщениеПользователю.Поле = "Объект.ЛогическийОператорДляУсловийЗапретаВыводаСтрок";
				СообщениеПользователю.Сообщить();
				ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
			КонецЕсли;
			
			Для Каждого СтрокаТЧ Из УсловияЗапретаВыводаСтрок Цикл
				
				Если Не ЗначениеЗаполнено(СтрокаТЧ.ИмяСравниваемогоРеквизита) Тогда
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнено имя реквизита в строке условий запрета вывода №" + СтрокаТЧ.НомерСтроки;
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.УсловияЗапретаВыводаСтрок[" + (СтрокаТЧ.НомерСтроки - 1) + "].ИмяСравниваемогоРеквизита";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				КонецЕсли;
				
				Если Не ЗначениеЗаполнено(СтрокаТЧ.Условие) Тогда
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнено условие в строке условий запрета вывода №" + СтрокаТЧ.НомерСтроки;
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.УсловияЗапретаВыводаСтрок[" + (СтрокаТЧ.НомерСтроки - 1) + "].Условие";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				КонецЕсли;
				
				Если Не ЗначениеЗаполнено(СтрокаТЧ.ТипСравнения) Тогда
					РеквизитыЗаполненыКорректно = Ложь;
					ТекстОшибки = "Не заполнен тип сравнения в строке условий запрета вывода №" + СтрокаТЧ.НомерСтроки;
					СообщениеПользователю = Новый СообщениеПользователю;
					СообщениеПользователю.Текст = ТекстОшибки;
					СообщениеПользователю.Поле = "Объект.УсловияЗапретаВыводаСтрок[" + (СтрокаТЧ.НомерСтроки - 1) + "].ТипСравнения";
					СообщениеПользователю.Сообщить();
					ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
				КонецЕсли;
				
				Если СтрокаТЧ.Условие <> "Заполнен" Тогда
					
					Если СтрокаТЧ.ТипСравнения = "Реквизит" И Не ЗначениеЗаполнено(СтрокаТЧ.ИмяСравниваемогоРеквизита2) Тогда
						РеквизитыЗаполненыКорректно = Ложь;
						ТекстОшибки = "Не заполнено имя реквизита в строке условий запрета вывода №" + СтрокаТЧ.НомерСтроки;
						СообщениеПользователю = Новый СообщениеПользователю;
						СообщениеПользователю.Текст = ТекстОшибки;
						СообщениеПользователю.Поле = "Объект.УсловияЗапретаВыводаСтрок[" + (СтрокаТЧ.НомерСтроки - 1) + "].ИмяСравниваемогоРеквизита2";
						СообщениеПользователю.Сообщить();
						ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
					КонецЕсли;
					
				КонецЕсли;
				
			КонецЦикла;
			
		КонецЕсли;   
		
	КонецЕсли;
	
	Возврат РеквизитыЗаполненыКорректно; 
	
КонецФункции

Функция СохранитьНастройкиВБазуНаСервере(НастройкаСсылка, СохранятьТабличныеДокументы) Экспорт
	
	ОперацияЗавершенаУспешно = Истина;
	
	Попытка
		НастройкаОбъект = НастройкаСсылка.ПолучитьОбъект();
		Данные = ПолучитьДанныеВВидеСтруктурыНаСервере(СохранятьТабличныеДокументы); 
		ХранилищеВнешнее = Новый ХранилищеЗначения(Данные);
		НастройкаОбъект.Операция = ХранилищеВнешнее;
		НастройкаОбъект.Записать();
		Сообщить("Данные успешно записаны в операцию """ + НастройкаОбъект.Наименование + """");
		СвязаннаяОперацияСравненияДанных = НастройкаСсылка;
		Заголовок = НастройкаОбъект.Наименование;
	Исключение
		ТекстОшибки = "Ошибка при записи данных в операцию """ + НастройкаСсылка.Наименование + """: " + ОписаниеОшибки();
		Сообщить(ТекстОшибки);
		ОперацияЗавершенаУспешно = Ложь;
	КонецПопытки;

	Возврат ОперацияЗавершенаУспешно;
	
КонецФункции

Процедура ОткрытьНастройкиИзБазыНаСервере(НастройкаСсылка, ЗагружатьТабличныеДокументы = Ложь) Экспорт
	
	ОперацияЗавершенаУспешно = Истина;
	
	Попытка
		
		ХранилищеВнешнее = НастройкаСсылка.Операция;
		Данные = ХранилищеВнешнее.Получить();
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, Данные);
		//Для меньшей путаницы с наименованиями в заголовок попадает наименование элемента справочника,
		//на основании которого была заполнена обработка
		Заголовок = НастройкаСсылка.Наименование;
		СвязаннаяОперацияСравненияДанных = НастройкаСсылка;
		
		//До версии 12.1.38 вместо реквизита ТипПериода использовался флаг ТипПериодаАбсолютный
		//Значение Истина флага ТипПериодаАбсолютный соответствует значение 0 реквизита ТипПериода
		//Если в настройке нет реквизита ТипПериода, необходимо его заполнить на основании флага ТипПериодаАбсолютный
		Если Не Данные.Свойство("ТипПериода") Тогда
			Если Данные.Свойство("ТипПериодаАбсолютный") Тогда
				ТипПериода = ?(Данные.ТипПериодаАбсолютный, 0, 1);
			КонецЕсли;
		КонецЕсли;
		
		//Настройки видимости колонок ключей появились в версии 15.5.58
		Если Не Данные.Свойство("ВидимостьКлюч1") Тогда
			ВидимостьКлюч1 = Истина;
		КонецЕсли;
		
		Если Не Данные.Свойство("ВидимостьКлюч2") Тогда
			ВидимостьКлюч2 = ЧислоСтолбцовВКлюче > 1;
		КонецЕсли;
		
		Если Не Данные.Свойство("ВидимостьКлюч3") Тогда
			ВидимостьКлюч3 = ЧислоСтолбцовВКлюче > 2;
		КонецЕсли;
		
		//Настройки видимости колонок число записей появились в версии 15.5.58
		Если Не Данные.Свойство("ВидимостьЧислоЗаписейА") Тогда
			ВидимостьЧислоЗаписейА = Истина;
		КонецЕсли;
		
		Если Не Данные.Свойство("ВидимостьЧислоЗаписейБ") Тогда
			ВидимостьЧислоЗаписейБ = Истина;
		КонецЕсли;
				
		Если Данные.Свойство("ТЗУсловияВыводаСтрок") Тогда
			УсловияВыводаСтрок.Загрузить(Данные.ТЗУсловияВыводаСтрок);
		Иначе
			УсловияВыводаСтрок.Очистить();
		КонецЕсли;
		
		Если Данные.Свойство("ТЗУсловияЗапретаВыводаСтрок") Тогда
			УсловияЗапретаВыводаСтрок.Загрузить(Данные.ТЗУсловияЗапретаВыводаСтрок);
		Иначе
			УсловияЗапретаВыводаСтрок.Очистить();
		КонецЕсли;
		
		Если Данные.Свойство("ТЗНастройкиФайлаА") Тогда
			НастройкиФайлаА.Загрузить(Данные.ТЗНастройкиФайлаА);
		Иначе
			НастройкиФайлаА.Очистить();
		КонецЕсли;
		
		Если Данные.Свойство("ТЗНастройкиФайлаБ") Тогда
			НастройкиФайлаБ.Загрузить(Данные.ТЗНастройкиФайлаБ);
		Иначе
			НастройкиФайлаБ.Очистить();
		КонецЕсли;
		
		Если Данные.Свойство("ТЗСписокПараметровА") Тогда
			СписокПараметровА.Загрузить(Данные.ТЗСписокПараметровА);
		Иначе
			СписокПараметровА.Очистить();
		КонецЕсли;
		
		Если Данные.Свойство("ТЗСписокПараметровБ") Тогда
			СписокПараметровБ.Загрузить(Данные.ТЗСписокПараметровБ);
		Иначе
			СписокПараметровБ.Очистить();
		КонецЕсли;
		
		Если Данные.Свойство("ТЗСписокПараметровБ") Тогда
			СписокПараметровБ.Загрузить(Данные.ТЗСписокПараметровБ);
		Иначе
			СписокПараметровБ.Очистить();
		КонецЕсли;
		
		Если ЗагружатьТабличныеДокументы Тогда
			Если Данные.ТипБазыА = 4 Тогда
				Попытка
					Если Данные.Свойство("ТаблицаАХранилище") Тогда
						ТаблицаА = Данные.ТаблицаАХранилище.Получить();
					КонецЕсли;
				Исключение
				КонецПопытки; 
			КонецЕсли;
			
			Если Данные.ТипБазыБ = 4 Тогда
				Попытка
					Если Данные.Свойство("ТаблицаБХранилище") Тогда
						ТаблицаБ = Данные.ТаблицаБХранилище.Получить();
					КонецЕсли;
				Исключение
				КонецПопытки; 
			КонецЕсли;
		КонецЕсли;
		
		//Реструктуризация параметров
		
		//Параметр СоставнойКлюч заменен на ЧислоСтолбцовВКлюче
		Если ЧислоСтолбцовВКлюче = 0 Тогда
			ЧислоСтолбцовВКлюче = ?(СоставнойКлюч, 2, 1); 
		КонецЕсли;
		
		Если ЧислоСтрокСПустымиКлючамиДляПрерыванияЧтения = 0 Тогда
			ЧислоСтрокСПустымиКлючамиДляПрерыванияЧтения = 2;
		КонецЕсли;
		
		Результат.Очистить();

	Исключение
		ТекстОшибки = ОписаниеОшибки();
		Сообщить(ТекстОшибки);
	КонецПопытки;

КонецПроцедуры

Функция ПолучитьДанныеВВидеСтруктурыНаСервере(СохранятьТабличныеДокументы = Ложь) Экспорт
	
	ДанныеСтруктура = Новый Структура;
	ДанныеСтруктура.Вставить("ТекстЗапросаА", 											ТекстЗапросаА);
	ДанныеСтруктура.Вставить("ТекстЗапросаБ", 											ТекстЗапросаБ);
	ДанныеСтруктура.Вставить("ТипБазыА", 												ТипБазыА);
	ДанныеСтруктура.Вставить("ТипБазыБ", 												ТипБазыБ);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеАПутьКБазе", 						ПодключениеКВнешнейБазеАПутьКБазе);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеБПутьКБазе",  						ПодключениеКВнешнейБазеБПутьКБазе);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеАЛогин",  							ПодключениеКВнешнейБазеАЛогин);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеБЛогин",  							ПодключениеКВнешнейБазеБЛогин);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеАПароль", 							ПодключениеКВнешнейБазеАПароль);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеБПароль",  						ПодключениеКВнешнейБазеБПароль);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеАСервер",  						ПодключениеКВнешнейБазеАСервер);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеБСервер",  						ПодключениеКВнешнейБазеБСервер);
	ДанныеСтруктура.Вставить("ВариантРаботыВнешнейБазыА",  								ВариантРаботыВнешнейБазыА);
	ДанныеСтруктура.Вставить("ВариантРаботыВнешнейБазыБ",   							ВариантРаботыВнешнейБазыБ);
	ДанныеСтруктура.Вставить("ВерсияПлатформыВнешнейБазыА",   							ВерсияПлатформыВнешнейБазыА);
	ДанныеСтруктура.Вставить("ВерсияПлатформыВнешнейБазыБ",   							ВерсияПлатформыВнешнейБазыБ);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеАДрайверSQL",						ПодключениеКВнешнейБазеАДрайверSQL);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеБДрайверSQL",						ПодключениеКВнешнейБазеБДрайверSQL);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеАФорматФайла",						ПодключениеКВнешнейБазеАФорматФайла);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеБФорматФайла",						ПодключениеКВнешнейБазеБФорматФайла);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеАПутьКФайлу",						ПодключениеКВнешнейБазеАПутьКФайлу);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеБПутьКФайлу",						ПодключениеКВнешнейБазеБПутьКФайлу);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеАУстройствоХраненияФайла",			ПодключениеКВнешнейБазеАУстройствоХраненияФайла);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеБУстройствоХраненияФайла",			ПодключениеКВнешнейБазеБУстройствоХраненияФайла);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеАНомерТаблицыВФайле",				ПодключениеКВнешнейБазеАНомерТаблицыВФайле);
	ДанныеСтруктура.Вставить("ПодключениеКВнешнейБазеБНомерТаблицыВФайле",				ПодключениеКВнешнейБазеБНомерТаблицыВФайле);
	
	ДанныеСтруктура.Вставить("КодДляВыводаСтрок", 										КодДляВыводаСтрок);
	ДанныеСтруктура.Вставить("КодДляЗапретаВыводаСтрок", 								КодДляЗапретаВыводаСтрок);
	ДанныеСтруктура.Вставить("ЛогическийОператорДляУсловийВыводаСтрок", 				ЛогическийОператорДляУсловийВыводаСтрок);
	ДанныеСтруктура.Вставить("ЛогическийОператорДляУсловийЗапретаВыводаСтрок", 			ЛогическийОператорДляУсловийЗапретаВыводаСтрок);
	ДанныеСтруктура.Вставить("КодДляВыводаСтрокРедактируетсяВручную", 					КодДляВыводаСтрокРедактируетсяВручную);
	ДанныеСтруктура.Вставить("КодДляЗапретаВыводаСтрокРедактируетсяВручную", 			КодДляЗапретаВыводаСтрокРедактируетсяВручную);
	ДанныеСтруктура.Вставить("УсловияВыводаСтрокОтключены", 							УсловияВыводаСтрокОтключены);
	ДанныеСтруктура.Вставить("УсловияЗапретаВыводаСтрокОтключены", 						УсловияЗапретаВыводаСтрокОтключены);
	
	ДанныеСтруктура.Вставить("РеляционнаяОперация",   									РеляционнаяОперация);
	ДанныеСтруктура.Вставить("ТипПериодаАбсолютный",									ТипПериодаАбсолютный);
	ДанныеСтруктура.Вставить("ТипПериода",												ТипПериода);
	ДанныеСтруктура.Вставить("ЗначениеАбсолютногоПериода",								ЗначениеАбсолютногоПериода);
	ДанныеСтруктура.Вставить("ЗначениеОтносительногоПериода",							ЗначениеОтносительногоПериода);
	ДанныеСтруктура.Вставить("ЗначениеПодчиненногоОтносительногоПериода",				ЗначениеПодчиненногоОтносительногоПериода);
	ДанныеСтруктура.Вставить("ДискретностьОтносительногоПериода",						ДискретностьОтносительногоПериода);
	ДанныеСтруктура.Вставить("ДискретностьПодчиненногоОтносительногоПериода",			ДискретностьПодчиненногоОтносительногоПериода);
	ДанныеСтруктура.Вставить("СоставнойКлюч",											СоставнойКлюч);
	ДанныеСтруктура.Вставить("ЧислоСтолбцовВКлюче",										ЧислоСтолбцовВКлюче);
	ДанныеСтруктура.Вставить("ЧислоСтрокСПустымиКлючамиДляПрерыванияЧтения",			ЧислоСтрокСПустымиКлючамиДляПрерыванияЧтения);
	ДанныеСтруктура.Вставить("ОтображатьТипыСтолбцовКлюча",								ОтображатьТипыСтолбцовКлюча);
	ДанныеСтруктура.Вставить("ПутьКФайлуВыгрузки",										ПутьКФайлуВыгрузки);
	ДанныеСтруктура.Вставить("ФорматФайлаВыгрузки",										ФорматФайлаВыгрузки);
	ДанныеСтруктура.Вставить("СортироватьТаблицуРасхождений",							СортироватьТаблицуРасхождений);
	ДанныеСтруктура.Вставить("ПорядокСортировкиТаблицыРасхождений",						ПорядокСортировкиТаблицыРасхождений);
	
	
	ДанныеСтруктура.Вставить("НомерПервойСтрокиФайлаА",									НомерПервойСтрокиФайлаА);
	ДанныеСтруктура.Вставить("НомерПервойСтрокиФайлаБ",									НомерПервойСтрокиФайлаБ);
	ДанныеСтруктура.Вставить("НомерСтолбцаСКлючомИзФайлаА",								НомерСтолбцаСКлючомИзФайлаА);	
	ДанныеСтруктура.Вставить("НомерСтолбцаСКлючом2ИзФайлаА",							НомерСтолбцаСКлючом2ИзФайлаА);
	ДанныеСтруктура.Вставить("НомерСтолбцаСКлючом3ИзФайлаА",							НомерСтолбцаСКлючом3ИзФайлаА);
	ДанныеСтруктура.Вставить("НомерСтолбцаСКлючомИзФайлаБ",								НомерСтолбцаСКлючомИзФайлаБ);
	ДанныеСтруктура.Вставить("НомерСтолбцаСКлючом2ИзФайлаБ",							НомерСтолбцаСКлючом2ИзФайлаБ);
	ДанныеСтруктура.Вставить("НомерСтолбцаСКлючом3ИзФайлаБ",							НомерСтолбцаСКлючом3ИзФайлаБ);
	ДанныеСтруктура.Вставить("ИмяСтолбцаСКлючомИзФайлаА",								ИмяСтолбцаСКлючомИзФайлаА);	
	ДанныеСтруктура.Вставить("ИмяСтолбцаСКлючом2ИзФайлаА",								ИмяСтолбцаСКлючом2ИзФайлаА);	
	ДанныеСтруктура.Вставить("ИмяСтолбцаСКлючом3ИзФайлаА",								ИмяСтолбцаСКлючом3ИзФайлаА);	
	ДанныеСтруктура.Вставить("ИмяСтолбцаСКлючомИзФайлаБ",								ИмяСтолбцаСКлючомИзФайлаБ);	
	ДанныеСтруктура.Вставить("ИмяСтолбцаСКлючом2ИзФайлаБ",								ИмяСтолбцаСКлючом2ИзФайлаБ);
	ДанныеСтруктура.Вставить("ИмяСтолбцаСКлючом3ИзФайлаБ",								ИмяСтолбцаСКлючом3ИзФайлаБ);
	ДанныеСтруктура.Вставить("ИмяЭлементаСДаннымиФайлаА",								ИмяЭлементаСДаннымиФайлаА);	
	ДанныеСтруктура.Вставить("ИмяЭлементаСДаннымиФайлаБ",								ИмяЭлементаСДаннымиФайлаБ);
	ДанныеСтруктура.Вставить("ИмяРодительскогоУзлаФайлаА",								ИмяРодительскогоУзлаФайлаА);
	ДанныеСтруктура.Вставить("ИмяРодительскогоУзлаФайлаБ",								ИмяРодительскогоУзлаФайлаБ);
	ДанныеСтруктура.Вставить("СпособХраненияДанныхВXMLФайлеА",							СпособХраненияДанныхВXMLФайлеА);
	ДанныеСтруктура.Вставить("СпособХраненияДанныхВXMLФайлеБ",							СпособХраненияДанныхВXMLФайлеБ);
	ДанныеСтруктура.Вставить("ПриводитьКлючКСтрокеА",									ПриводитьКлючКСтрокеА);
	ДанныеСтруктура.Вставить("ПриводитьКлюч2КСтрокеА",									ПриводитьКлюч2КСтрокеА);
	ДанныеСтруктура.Вставить("ПриводитьКлюч3КСтрокеА",									ПриводитьКлюч3КСтрокеА);
	ДанныеСтруктура.Вставить("ПриводитьКлючКСтрокеБ",									ПриводитьКлючКСтрокеБ);
	ДанныеСтруктура.Вставить("ПриводитьКлюч2КСтрокеБ",									ПриводитьКлюч2КСтрокеБ);
	ДанныеСтруктура.Вставить("ПриводитьКлюч3КСтрокеБ",									ПриводитьКлюч3КСтрокеБ);
	ДанныеСтруктура.Вставить("ДлинаКлючаПриПриведенииКСтрокеА",							ДлинаКлючаПриПриведенииКСтрокеА);
	ДанныеСтруктура.Вставить("ДлинаКлюча2ПриПриведенииКСтрокеА",						ДлинаКлюча2ПриПриведенииКСтрокеА);
	ДанныеСтруктура.Вставить("ДлинаКлюча3ПриПриведенииКСтрокеА",						ДлинаКлюча3ПриПриведенииКСтрокеА);
	ДанныеСтруктура.Вставить("ДлинаКлючаПриПриведенииКСтрокеБ",							ДлинаКлючаПриПриведенииКСтрокеБ);
	ДанныеСтруктура.Вставить("ДлинаКлюча2ПриПриведенииКСтрокеБ",						ДлинаКлюча2ПриПриведенииКСтрокеБ);
	ДанныеСтруктура.Вставить("ДлинаКлюча3ПриПриведенииКСтрокеБ",						ДлинаКлюча3ПриПриведенииКСтрокеБ);
	ДанныеСтруктура.Вставить("ИспользоватьВКачествеКлючаУникальныйИдентификаторА", 		ИспользоватьВКачествеКлючаУникальныйИдентификаторА);
	ДанныеСтруктура.Вставить("ИспользоватьВКачествеКлюча2УникальныйИдентификаторА", 	ИспользоватьВКачествеКлюча2УникальныйИдентификаторА);
	ДанныеСтруктура.Вставить("ИспользоватьВКачествеКлюча3УникальныйИдентификаторА", 	ИспользоватьВКачествеКлюча3УникальныйИдентификаторА);
	ДанныеСтруктура.Вставить("ИспользоватьВКачествеКлючаУникальныйИдентификаторБ", 		ИспользоватьВКачествеКлючаУникальныйИдентификаторБ);
	ДанныеСтруктура.Вставить("ИспользоватьВКачествеКлюча2УникальныйИдентификаторБ", 	ИспользоватьВКачествеКлюча2УникальныйИдентификаторБ);
	ДанныеСтруктура.Вставить("ИспользоватьВКачествеКлюча3УникальныйИдентификаторБ", 	ИспользоватьВКачествеКлюча3УникальныйИдентификаторБ);
	ДанныеСтруктура.Вставить("ПриводитьКлючКВерхнемуРегиструА", 						ПриводитьКлючКВерхнемуРегиструА);
	ДанныеСтруктура.Вставить("ПриводитьКлюч2КВерхнемуРегиструА", 						ПриводитьКлюч2КВерхнемуРегиструА);
	ДанныеСтруктура.Вставить("ПриводитьКлюч3КВерхнемуРегиструА", 						ПриводитьКлюч3КВерхнемуРегиструА);
	ДанныеСтруктура.Вставить("ПриводитьКлючКВерхнемуРегиструБ", 						ПриводитьКлючКВерхнемуРегиструБ);
	ДанныеСтруктура.Вставить("ПриводитьКлюч2КВерхнемуРегиструБ", 						ПриводитьКлюч2КВерхнемуРегиструБ);
	ДанныеСтруктура.Вставить("ПриводитьКлюч3КВерхнемуРегиструБ", 						ПриводитьКлюч3КВерхнемуРегиструБ);
	ДанныеСтруктура.Вставить("УдалятьИзКлючаФигурныеСкобкиА", 							УдалятьИзКлючаФигурныеСкобкиА);
	ДанныеСтруктура.Вставить("УдалятьИзКлюча2ФигурныеСкобкиА", 							УдалятьИзКлюча2ФигурныеСкобкиА);
	ДанныеСтруктура.Вставить("УдалятьИзКлюча3ФигурныеСкобкиА", 							УдалятьИзКлюча3ФигурныеСкобкиА);
	ДанныеСтруктура.Вставить("УдалятьИзКлючаФигурныеСкобкиБ", 							УдалятьИзКлючаФигурныеСкобкиБ);
	ДанныеСтруктура.Вставить("УдалятьИзКлюча2ФигурныеСкобкиБ", 							УдалятьИзКлюча2ФигурныеСкобкиБ);
	ДанныеСтруктура.Вставить("УдалятьИзКлюча3ФигурныеСкобкиБ", 							УдалятьИзКлюча3ФигурныеСкобкиБ);
	ДанныеСтруктура.Вставить("ПроизвольныйКодКлюча1А",		 							ПроизвольныйКодКлюча1А);
	ДанныеСтруктура.Вставить("ПроизвольныйКодКлюча2А",		 							ПроизвольныйКодКлюча2А);
	ДанныеСтруктура.Вставить("ПроизвольныйКодКлюча3А",		 							ПроизвольныйКодКлюча3А);
	ДанныеСтруктура.Вставить("ПроизвольныйКодКлюча1Б",		 							ПроизвольныйКодКлюча1Б);
	ДанныеСтруктура.Вставить("ПроизвольныйКодКлюча2Б",		 							ПроизвольныйКодКлюча2Б);
	ДанныеСтруктура.Вставить("ПроизвольныйКодКлюча3Б",		 							ПроизвольныйКодКлюча3Б);
	ДанныеСтруктура.Вставить("ВыполнятьПроизвольныйКодКлюча1А",		 					ВыполнятьПроизвольныйКодКлюча1А);
	ДанныеСтруктура.Вставить("ВыполнятьПроизвольныйКодКлюча2А",		 					ВыполнятьПроизвольныйКодКлюча2А);
	ДанныеСтруктура.Вставить("ВыполнятьПроизвольныйКодКлюча3А",		 					ВыполнятьПроизвольныйКодКлюча3А);
	ДанныеСтруктура.Вставить("ВыполнятьПроизвольныйКодКлюча1Б",		 					ВыполнятьПроизвольныйКодКлюча1Б);
	ДанныеСтруктура.Вставить("ВыполнятьПроизвольныйКодКлюча2Б",		 					ВыполнятьПроизвольныйКодКлюча2Б);
	ДанныеСтруктура.Вставить("ВыполнятьПроизвольныйКодКлюча3Б",		 					ВыполнятьПроизвольныйКодКлюча3Б);
	ДанныеСтруктура.Вставить("ВидимостьРеквизитА1",										ВидимостьРеквизитА1);
	ДанныеСтруктура.Вставить("ВидимостьРеквизитА2",										ВидимостьРеквизитА2);
	ДанныеСтруктура.Вставить("ВидимостьРеквизитА3",										ВидимостьРеквизитА3);
	ДанныеСтруктура.Вставить("ВидимостьРеквизитА4",										ВидимостьРеквизитА4);
	ДанныеСтруктура.Вставить("ВидимостьРеквизитА5",										ВидимостьРеквизитА5);
	ДанныеСтруктура.Вставить("ВидимостьРеквизитБ1",										ВидимостьРеквизитБ1);
	ДанныеСтруктура.Вставить("ВидимостьРеквизитБ2",										ВидимостьРеквизитБ2);
	ДанныеСтруктура.Вставить("ВидимостьРеквизитБ3",										ВидимостьРеквизитБ3);
	ДанныеСтруктура.Вставить("ВидимостьРеквизитБ4",										ВидимостьРеквизитБ4);
	ДанныеСтруктура.Вставить("ВидимостьРеквизитБ5",										ВидимостьРеквизитБ5);
	
	ДанныеСтруктура.Вставить("СворачиватьТаблицуА",		 								СворачиватьТаблицуА);
	ДанныеСтруктура.Вставить("СворачиватьТаблицуБ",		 								СворачиватьТаблицуБ);
	
	ДанныеСтруктура.Вставить("ТЗУсловияВыводаСтрок", 									УсловияВыводаСтрок.Выгрузить());
	ДанныеСтруктура.Вставить("ТЗУсловияЗапретаВыводаСтрок", 							УсловияЗапретаВыводаСтрок.Выгрузить());
	ДанныеСтруктура.Вставить("ТЗНастройкиФайлаА", 										НастройкиФайлаА.Выгрузить());
	ДанныеСтруктура.Вставить("ТЗНастройкиФайлаБ", 										НастройкиФайлаБ.Выгрузить());
	ДанныеСтруктура.Вставить("ТЗСписокПараметровА", 									СписокПараметровА.Выгрузить());
	ДанныеСтруктура.Вставить("ТЗСписокПараметровБ", 									СписокПараметровБ.Выгрузить());	
	
	Если СохранятьТабличныеДокументы Тогда
		
		Если ТипБазыА = 4 Тогда
			ТаблицаАХранилище = Новый ХранилищеЗначения(ТаблицаА);
			
			Если ДанныеСтруктура.Свойство("ТаблицаАХранилище") Тогда
				ДанныеСтруктура.ТаблицаАХранилище = ТаблицаАХранилище;
			Иначе
				ДанныеСтруктура.Вставить("ТаблицаАХранилище", ТаблицаАХранилище);
			КонецЕсли;
		КонецЕсли;
		
		Если ТипБазыБ = 4 Тогда
			ТаблицаБХранилище = Новый ХранилищеЗначения(ТаблицаБ);
			
			Если ДанныеСтруктура.Свойство("ТаблицаБХранилище") Тогда
				ДанныеСтруктура.ТаблицаБХранилище = ТаблицаБХранилище;
			Иначе
				ДанныеСтруктура.Вставить("ТаблицаБХранилище", ТаблицаБХранилище);
			КонецЕсли;
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат ДанныеСтруктура;
	
КонецФункции

Процедура УстановитьПараметры(Запрос, ИдентификаторБазы)
	Для Каждого Параметр Из ЭтотОбъект["СписокПараметров" + ИдентификаторБазы] Цикл
		Если ТипЗнч(Параметр.ЗначениеПараметра) <> Тип("Неопределено") Тогда
			Если Параметр.ИмяПараметра = "ДатаНачала" Или Параметр.ИмяПараметра = "ДатаОкончания" Тогда
				Продолжить;
			КонецЕсли;
			Запрос.УстановитьПараметр(Параметр.ИмяПараметра, Параметр.ЗначениеПараметра);			
		КонецЕсли;
	КонецЦикла;       	
КонецПроцедуры

Процедура ЗаполнитьПеременныеРЗначениямиПоУмолчанию()
	
	Р1 = Неопределено;
	Р2 = Неопределено;
	Р3 = Неопределено;
	Р4 = Неопределено;
	Р5 = Неопределено;
	
КонецПроцедуры

Функция ВыгрузитьРезультатВФайлНаСервере(ДляКлиента = Ложь) Экспорт
	
	ФорматФайлаВыгрузки = ВРег(ФорматФайлаВыгрузки);
	
	Если ПустаяСтрока(ФорматФайлаВыгрузки) Тогда
		ТекстОшибки = "Не указан формат файла выгрузки";
		СообщениеПользователю = Новый СообщениеПользователю;
		СообщениеПользователю.Текст = ТекстОшибки;
		СообщениеПользователю.Поле = "Объект.ФорматФайлаВыгрузки";
		СообщениеПользователю.Сообщить();
		Возврат Неопределено;
	КонецЕсли;
	
	Если ДляКлиента Тогда
		ПутьКВременномуФайлу = ПолучитьИмяВременногоФайла(ФорматФайлаВыгрузки);
	Иначе
		Если ПустаяСтрока(ПутьКФайлуВыгрузки) Тогда
			ТекстОшибки = "Не заполнен путь к файлу выгрузки (на сервере)";
			СообщениеПользователю = Новый СообщениеПользователю;
			СообщениеПользователю.Текст = ТекстОшибки;
			СообщениеПользователю.Поле = "Объект.ПутьКФайлуВыгрузки";
			СообщениеПользователю.Сообщить();
			Возврат Неопределено;
		КонецЕсли;
		
		ПутьКВременномуФайлу = ПутьКФайлуВыгрузки;
	КонецЕсли;
	
	Если Результат.Количество() = 0 Тогда
		ТекстОшибки = "Нет данных для выгрузки";
		СообщениеПользователю = Новый СообщениеПользователю;
		СообщениеПользователю.Текст = ТекстОшибки;
		СообщениеПользователю.Поле = "Объект.Результат";
		СообщениеПользователю.Сообщить();
		Возврат Неопределено;
	КонецЕсли;
		
	Попытка	
		УдалитьФайлы(ПутьКВременномуФайлу);	
	Исключение КонецПопытки;
	
	Сообщить(Формат(ТекущаяДата(), "ДЛФ=DT") + " Выгрузка в файл """ + ПутьКВременномуФайлу + """ формата """ + ФорматФайлаВыгрузки + """ начата");
	
	Если ФорматФайлаВыгрузки = "CSV" Тогда
		
		РазделительКолонок = ";";
		ЗаписьТекста = Новый ЗаписьТекста(ПутьКВременномуФайлу, КодировкаТекста.UTF8);
		
		СписокЗаголовковСтрокой = "№ строки" + РазделительКолонок
				+ ?(ВидимостьКлюч1, "Ключ 1" + РазделительКолонок, "")
				+ ?(ЧислоСтолбцовВКлюче > 1 И ВидимостьКлюч2, "Ключ 2" + РазделительКолонок, "")
				+ ?(ЧислоСтолбцовВКлюче > 2 И ВидимостьКлюч3, "Ключ 3" + РазделительКолонок, "")
				+ ?(ВидимостьЧислоЗаписейА, "Число записей А" + РазделительКолонок, "")
				+ ?(ВидимостьЧислоЗаписейБ, "Число записей Б" + РазделительКолонок, "");
		
		Для СчетчикРеквизитов = 1 По ЧислоРеквизитов Цикл 
			Если ЭтотОбъект["ВидимостьРеквизитА" + СчетчикРеквизитов] Тогда
				СписокЗаголовковСтрокой = СписокЗаголовковСтрокой + РазделительКолонок + СтрЗаменить(ПредставленияЗаголовковРеквизитов["А" + СчетчикРеквизитов], РазделительКолонок,",");
			КонецЕсли;
		КонецЦикла;
		
		Для СчетчикРеквизитов = 1 По ЧислоРеквизитов Цикл 
			Если ЭтотОбъект["ВидимостьРеквизитБ" + СчетчикРеквизитов] Тогда
				СписокЗаголовковСтрокой = СписокЗаголовковСтрокой + РазделительКолонок + СтрЗаменить(ПредставленияЗаголовковРеквизитов["Б" + СчетчикРеквизитов], РазделительКолонок,",");
			КонецЕсли;
		КонецЦикла;
		
		СписокЗаголовковСтрокой = СтрЗаменить(СписокЗаголовковСтрокой, "" + РазделительКолонок + РазделительКолонок, РазделительКолонок);
		ЗаписьТекста.Записать(СписокЗаголовковСтрокой);
			
		СчетчикСтрок = 0;
		Для Каждого СтрокаТЧ Из Результат Цикл
			
			СчетчикСтрок = СчетчикСтрок + 1;
			
			ЗаписьТекста.Записать(
				Символы.ПС
					+ "" + СтрокаТЧ.НомерСтроки + РазделительКолонок
					+ ?(ВидимостьКлюч1, "" + СтрокаТЧ.Ключ1 + РазделительКолонок, "")
					+ ?(ЧислоСтолбцовВКлюче > 1 И ВидимостьКлюч2, "" + СтрокаТЧ.Ключ2 + РазделительКолонок, "")
					+ ?(ЧислоСтолбцовВКлюче > 2 И ВидимостьКлюч3, "" + СтрокаТЧ.Ключ3 + РазделительКолонок, "")
					+ ?(ВидимостьЧислоЗаписейА, "" + СтрокаТЧ.ЧислоЗаписейА + РазделительКолонок, "")
					+ ?(ВидимостьЧислоЗаписейБ, "" + СтрокаТЧ.ЧислоЗаписейБ + РазделительКолонок, "")
					+ ?(ВидимостьРеквизитА1, "" + СтрокаТЧ.РеквизитА1 + РазделительКолонок, "")
					+ ?(ВидимостьРеквизитА2, "" + СтрокаТЧ.РеквизитА2 + РазделительКолонок, "")
					+ ?(ВидимостьРеквизитА3, "" + СтрокаТЧ.РеквизитА3 + РазделительКолонок, "")
					+ ?(ВидимостьРеквизитА4, "" + СтрокаТЧ.РеквизитА4 + РазделительКолонок, "")
					+ ?(ВидимостьРеквизитА5, "" + СтрокаТЧ.РеквизитА5 + РазделительКолонок, "")
					+ ?(ВидимостьРеквизитБ1, "" + СтрокаТЧ.РеквизитБ1 + РазделительКолонок, "")
					+ ?(ВидимостьРеквизитБ2, "" + СтрокаТЧ.РеквизитБ2 + РазделительКолонок, "")
					+ ?(ВидимостьРеквизитБ3, "" + СтрокаТЧ.РеквизитБ3 + РазделительКолонок, "")
					+ ?(ВидимостьРеквизитБ4, "" + СтрокаТЧ.РеквизитБ4 + РазделительКолонок, "")
					+ ?(ВидимостьРеквизитБ5, "" + СтрокаТЧ.РеквизитБ5 + РазделительКолонок, "")
			);
		
		КонецЦикла; 
		
		ЗаписьТекста.Закрыть();
		
	ИначеЕсли ФорматФайлаВыгрузки = "XLS" Или
		ФорматФайлаВыгрузки = "DOCX" Или
		ФорматФайлаВыгрузки = "HTML" Или
		ФорматФайлаВыгрузки = "MXL" Или
		ФорматФайлаВыгрузки = "ODS" Или
		ФорматФайлаВыгрузки = "PDF" Или
		ФорматФайлаВыгрузки = "TXT" Или
		ФорматФайлаВыгрузки = "XLSX" Тогда
		
		//НомерКолонкиЧислоЗаписейА = ?(ЧислоСтолбцовВКлюче > 1 И ВидимостьКлюч2, ?(ЧислоСтолбцовВКлюче > 2 И ВидимостьКлюч3, 5, 4), 3);
		ЧислоВыгружаемыхКлючей = ?(ВидимостьКлюч1, 1, 0) + ?(ЧислоСтолбцовВКлюче > 1 И ВидимостьКлюч2, 1, 0) + ?(ЧислоСтолбцовВКлюче > 2 И ВидимостьКлюч3, 1, 0);
		НомерКолонкиСПервымВыгружаемымРеквизитом = ЧислоВыгружаемыхКлючей + ?(ВидимостьЧислоЗаписейА, 1, 0) + ?(ВидимостьЧислоЗаписейБ, 1, 0) + 2;
		
		ТабличныйДокумент = Новый ТабличныйДокумент;
		ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
		ТабличныйДокумент.АвтоМасштаб = Истина;
		
		УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, 1, 1, "№ строки",,7);
		Если ВидимостьКлюч1 Тогда
			УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, 1, 2, "Ключ 1");
		КонецЕсли;
		Если ЧислоСтолбцовВКлюче > 1 И ВидимостьКлюч2 Тогда
			УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, 1, ?(ВидимостьКлюч1, 1, 0) + 2, "Ключ 2");
		КонецЕсли;
		Если ЧислоСтолбцовВКлюче > 2 И ВидимостьКлюч3 Тогда
			УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, 1, ?(ВидимостьКлюч1, 1, 0) + ?(ВидимостьКлюч2, 1, 0) + 2, "Ключ 3");
		КонецЕсли;
		
		Если ВидимостьЧислоЗаписейА Тогда
			УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, 1, ЧислоВыгружаемыхКлючей + 2,  		"Число записей А",, 7);
		КонецЕсли; 
		
		Если ВидимостьЧислоЗаписейБ Тогда
			УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, 1, ЧислоВыгружаемыхКлючей + ?(ВидимостьЧислоЗаписейА, 1, 0) + 2,  	"Число записей Б",, 7);
		КонецЕсли; 
		
		СмещениеОтКолонкиСПервымВыгружаемымРеквизитом = 0;
		Для СчетчикРеквизитов = 1 По ЧислоРеквизитов Цикл 
			Если ЭтотОбъект["ВидимостьРеквизитА" + СчетчикРеквизитов] Тогда
				УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, 1, НомерКолонкиСПервымВыгружаемымРеквизитом + СмещениеОтКолонкиСПервымВыгружаемымРеквизитом, ПредставленияЗаголовковРеквизитов["А" + СчетчикРеквизитов]);
				СмещениеОтКолонкиСПервымВыгружаемымРеквизитом = СмещениеОтКолонкиСПервымВыгружаемымРеквизитом + 1;
			КонецЕсли;
		КонецЦикла;
		
		Для СчетчикРеквизитов = 1 По ЧислоРеквизитов Цикл 
			Если ЭтотОбъект["ВидимостьРеквизитБ" + СчетчикРеквизитов] Тогда
				УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, 1, НомерКолонкиСПервымВыгружаемымРеквизитом + СмещениеОтКолонкиСПервымВыгружаемымРеквизитом, ПредставленияЗаголовковРеквизитов["Б" + СчетчикРеквизитов]);
				СмещениеОтКолонкиСПервымВыгружаемымРеквизитом = СмещениеОтКолонкиСПервымВыгружаемымРеквизитом + 1;
			КонецЕсли;
		КонецЦикла;
		
		РазмерыКолонок = Новый Структура;
		РазмерыКолонок.Вставить("К1", 0);
		РазмерыКолонок.Вставить("К2", 0);
		РазмерыКолонок.Вставить("К3", 0);
		РазмерыКолонок.Вставить("А1", 0);
		РазмерыКолонок.Вставить("А2", 0);
		РазмерыКолонок.Вставить("А3", 0);
		РазмерыКолонок.Вставить("А4", 0);
		РазмерыКолонок.Вставить("А5", 0);
		РазмерыКолонок.Вставить("Б1", 0);
		РазмерыКолонок.Вставить("Б2", 0);
		РазмерыКолонок.Вставить("Б3", 0);
		РазмерыКолонок.Вставить("Б4", 0);
		РазмерыКолонок.Вставить("Б5", 0);
		СчетчикСтрок = 0;
		
		Для Каждого СтрокаТЧ Из Результат Цикл
			
			РазмерыКолонок.К1 = Макс(2,РазмерыКолонок.К1,СтрДлина(СтрокаТЧ.Ключ1));
			Если ЧислоСтолбцовВКлюче > 1 И ВидимостьКлюч2 Тогда
				РазмерыКолонок.К2 = Макс(2,РазмерыКолонок.К2,СтрДлина(СтрокаТЧ.Ключ2));
			КонецЕсли;
			Если ЧислоСтолбцовВКлюче > 2 И ВидимостьКлюч3 Тогда
				РазмерыКолонок.К3 = Макс(2,РазмерыКолонок.К3,СтрДлина(СтрокаТЧ.Ключ3));
			КонецЕсли;
			
			РазмерыКолонок.А1 = Макс(2,РазмерыКолонок.А1,СтрДлина(СтрокаТЧ.РеквизитА1));
			РазмерыКолонок.А2 = Макс(2,РазмерыКолонок.А2,СтрДлина(СтрокаТЧ.РеквизитА2));
			РазмерыКолонок.А3 = Макс(2,РазмерыКолонок.А3,СтрДлина(СтрокаТЧ.РеквизитА3));
			РазмерыКолонок.А4 = Макс(2,РазмерыКолонок.А4,СтрДлина(СтрокаТЧ.РеквизитА4));
			РазмерыКолонок.А5 = Макс(2,РазмерыКолонок.А5,СтрДлина(СтрокаТЧ.РеквизитА5));
			РазмерыКолонок.Б1 = Макс(2,РазмерыКолонок.Б1,СтрДлина(СтрокаТЧ.РеквизитБ1));
			РазмерыКолонок.Б2 = Макс(2,РазмерыКолонок.Б2,СтрДлина(СтрокаТЧ.РеквизитБ2));
			РазмерыКолонок.Б3 = Макс(2,РазмерыКолонок.Б3,СтрДлина(СтрокаТЧ.РеквизитБ3));
			РазмерыКолонок.Б4 = Макс(2,РазмерыКолонок.Б4,СтрДлина(СтрокаТЧ.РеквизитБ4));
			РазмерыКолонок.Б5 = Макс(2,РазмерыКолонок.Б5,СтрДлина(СтрокаТЧ.РеквизитБ5));;
			
			СчетчикСтрок = СчетчикСтрок + 1;
			
			УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, СчетчикСтрок + 1, 1, СтрокаТЧ.НомерСтроки, 1, 7);
			Если ВидимостьКлюч1 Тогда
				УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, СчетчикСтрок + 1, 2, СтрокаТЧ.Ключ1,, РазмерыКолонок.К1);
			КонецЕсли;
			Если ЧислоСтолбцовВКлюче > 1 И ВидимостьКлюч2 Тогда
				УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, СчетчикСтрок + 1, ?(ВидимостьКлюч1, 1, 0) + 2, СтрокаТЧ.Ключ2,, РазмерыКолонок.К2);
			КонецЕсли;
			Если ЧислоСтолбцовВКлюче > 2 И ВидимостьКлюч3 Тогда
				УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, СчетчикСтрок + 1, ?(ВидимостьКлюч1, 1, 0) + ?(ВидимостьКлюч2, 1, 0) + 2, СтрокаТЧ.Ключ3,, РазмерыКолонок.К3);
			КонецЕсли;
			
			Если ВидимостьЧислоЗаписейА Тогда
				УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, СчетчикСтрок + 1, ЧислоВыгружаемыхКлючей + 2,	СтрокаТЧ.ЧислоЗаписейА, 1, 7);
			КонецЕсли;
			
			Если ВидимостьЧислоЗаписейБ Тогда
				УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, СчетчикСтрок + 1, ЧислоВыгружаемыхКлючей + ?(ВидимостьЧислоЗаписейА, 1, 0) + 2, СтрокаТЧ.ЧислоЗаписейБ, 1, 7);
			КонецЕсли;
			
			СмещениеОтКолонкиСПервымВыгружаемымРеквизитом = 0;
			Для СчетчикРеквизитов = 1 По ЧислоРеквизитов Цикл 
				Если ЭтотОбъект["ВидимостьРеквизитА" + СчетчикРеквизитов] Тогда
					УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, СчетчикСтрок + 1, НомерКолонкиСПервымВыгружаемымРеквизитом + СмещениеОтКолонкиСПервымВыгружаемымРеквизитом, СтрокаТЧ["РеквизитА" + СчетчикРеквизитов],, РазмерыКолонок["А" + СчетчикРеквизитов]);
					СмещениеОтКолонкиСПервымВыгружаемымРеквизитом = СмещениеОтКолонкиСПервымВыгружаемымРеквизитом + 1;
				КонецЕсли;
			КонецЦикла;
			
			Для СчетчикРеквизитов = 1 По ЧислоРеквизитов Цикл 
				Если ЭтотОбъект["ВидимостьРеквизитБ" + СчетчикРеквизитов] Тогда
					УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, СчетчикСтрок + 1, НомерКолонкиСПервымВыгружаемымРеквизитом + СмещениеОтКолонкиСПервымВыгружаемымРеквизитом, СтрокаТЧ["РеквизитБ" + СчетчикРеквизитов],, РазмерыКолонок["Б" + СчетчикРеквизитов]);
					СмещениеОтКолонкиСПервымВыгружаемымРеквизитом = СмещениеОтКолонкиСПервымВыгружаемымРеквизитом + 1;
				КонецЕсли;
			КонецЦикла;
			
		КонецЦикла; 
		
		ТабличныйДокумент.Записать(ПутьКВременномуФайлу, ТипФайлаТабличногоДокумента[ФорматФайлаВыгрузки]);
		
	Иначе
		
		ТекстОшибки = "Формат файла выгрузки """ + ФорматФайлаВыгрузки + """ не предусмотрен";
		СообщениеПользователю = Новый СообщениеПользователю;
		СообщениеПользователю.Текст = ТекстОшибки;
		СообщениеПользователю.Поле = "Объект.ФорматФайлаВыгрузки";
		СообщениеПользователю.Сообщить();
		Возврат Неопределено;
		
	КонецЕсли;
	
	Если ДляКлиента Тогда
		
		ДанныеФайла = Новый ДвоичныеДанные(ПутьКВременномуФайлу);
		АдресФайла = ПоместитьВоВременноеХранилище(ДанныеФайла);
		
		Попытка
			УдалитьФайлы(ПутьКВременномуФайлу);
		Исключение КонецПопытки;
		
		Возврат АдресФайла;
		
	Иначе
		
		Сообщить(Формат(ТекущаяДата(), "ДЛФ=DT") + " Выгрузка в файл """ + ПутьКВременномуФайлу + """ формата """ + ФорматФайлаВыгрузки + """ завершена (число строк: " + СчетчикСтрок + ")");
		Возврат Неопределено;
		
	КонецЕсли;
	
КонецФункции

Процедура УстановитьЗначениеЯчейкиТабличногоДокумента(ТабличныйДокумент, НомерСтроки, НомерКолонки, ЗначениеЯчейки, пТипЗначения = 0, ШиринаКолонки = 6)
	
	Если пТипЗначения = 0 Тогда
		ТипЗначения = Новый ОписаниеТипов("Строка");
	ИначеЕсли пТипЗначения = 1 Тогда
		ТипЗначения = Новый ОписаниеТипов("Число");
	КонецЕсли;
	
	Если Ложь Тогда
		ТабличныйДокумент = Новый ТабличныйДокумент;
	КонецЕсли;
	
	ТабличныйДокумент.Область(НомерСтроки,НомерКолонки).СодержитЗначение = 	Истина;
	ТабличныйДокумент.Область(НомерСтроки,НомерКолонки).ТипЗначения = 		ТипЗначения;
	ТабличныйДокумент.Область(НомерСтроки,НомерКолонки).Значение = 			ЗначениеЯчейки;
	ТабличныйДокумент.Область(НомерСтроки,НомерКолонки).ШиринаКолонки = 	ШиринаКолонки;
	Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);
	ТабличныйДокумент.Область(НомерСтроки,НомерКолонки).ГраницаСверху = Линия;
	ТабличныйДокумент.Область(НомерСтроки,НомерКолонки).ГраницаСнизу = Линия;
	ТабличныйДокумент.Область(НомерСтроки,НомерКолонки).ГраницаСлева = Линия;
	ТабличныйДокумент.Область(НомерСтроки,НомерКолонки).ГраницаСправа = Линия;
	ТабличныйДокумент.Область(НомерСтроки,НомерКолонки).ГоризонтальноеПоложение = ГоризонтальноеПоложение.Лево;
	
КонецПроцедуры

Процедура ОбновитьДанныеПериода() Экспорт
	
	ТекущаяДата = НачалоДня(ТекущаяДата());
	ТочкаОтсчетаДатыНачала = НачалоДня(ТекущаяДата) + 24 * 3600;
	
	//Умолчания
	ДатаНачала = ТекущаяДата;
	ДатаОкончания = КонецДня(ТекущаяДата);
	
	//Абсолютный период
	Если ТипПериода = 0 Тогда
		
	Иначе
		
		Если ДискретностьОтносительногоПериода = "год" Тогда
			ДатаНачала = ДобавитьМесяц(ТочкаОтсчетаДатыНачала, -1 * 12 * ЗначениеОтносительногоПериода);
		ИначеЕсли ДискретностьОтносительногоПериода = "месяц" Тогда
			ДатаНачала = ДобавитьМесяц(ТочкаОтсчетаДатыНачала, -1 * ЗначениеОтносительногоПериода);
		ИначеЕсли ДискретностьОтносительногоПериода = "день" Тогда
			ДатаНачала = ТочкаОтсчетаДатыНачала - 24 * 3600 * ЗначениеОтносительногоПериода;
		КонецЕсли;
		
		//Последние Х
		Если ТипПериода = 1 Тогда

			ДатаОкончания = КонецДня(ТекущаяДата);
			
		//Первые X из последних Y
		ИначеЕсли ТипПериода = 2 Тогда
			
			ТочкаОтсчетаДатыОкончания = ДатаНачала - 1;
			
			Если ДискретностьПодчиненногоОтносительногоПериода = "год" Тогда
				ДатаОкончания = ДобавитьМесяц(ТочкаОтсчетаДатыОкончания, 1 * 12 * ЗначениеПодчиненногоОтносительногоПериода);
			ИначеЕсли ДискретностьПодчиненногоОтносительногоПериода = "месяц" Тогда
				ДатаОкончания = ДобавитьМесяц(ТочкаОтсчетаДатыОкончания, 1 * ЗначениеПодчиненногоОтносительногоПериода);
			ИначеЕсли ДискретностьПодчиненногоОтносительногоПериода = "день" Тогда
				ДатаОкончания = ТочкаОтсчетаДатыОкончания + 24 * 3600 * ЗначениеПодчиненногоОтносительногоПериода;
			КонецЕсли;
			
		Иначе
			
			ДатаОкончания = КонецДня(ТекущаяДата);
		
		КонецЕсли;
		
		ЗначениеАбсолютногоПериода.ДатаНачала = Мин(ДатаНачала,ДатаОкончания);
		ЗначениеАбсолютногоПериода.ДатаОкончания = ДатаОкончания;
		
	КонецЕсли;
		
КонецПроцедуры

Функция НайтиПодчиненныйУзелXMLФайлаПоИмени(ТекущийУзел, ИмяИскомогоУзла)
	
	//Ветка для корневого элемента
	Если ТекущийУзел.ИмяУзла = ИмяИскомогоУзла Тогда
					
		Возврат ТекущийУзел;
		
	КонецЕсли;
	
	Для Каждого ПодчиненныйУзел Из ТекущийУзел.ДочерниеУзлы Цикл
					
		Если ПодчиненныйУзел.ИмяУзла = ИмяИскомогоУзла Тогда
					
			НайденныйУзел = ПодчиненныйУзел;
			
		Иначе 
		
			НайденныйУзел = НайтиПодчиненныйУзелXMLФайлаПоИмени(ПодчиненныйУзел, ИмяИскомогоУзла); 
			
		КонецЕсли;
		
		Если НайденныйУзел <> Неопределено Тогда
			
			Возврат НайденныйУзел
			
		КонецЕсли;
		
	КонецЦикла;

	Возврат Неопределено;
	
КонецФункции

Функция ПроверитьВозможностьПодключенияКВнешейБазе1С8(ИдентификаторБазы, ТекстОшибок)

	ПодключениеВыполненоУспешно = Ложь;
	
	Если ЭтотОбъект["ВариантРаботыВнешнейБазы" + ИдентификаторБазы] = 0 Тогда
		ПараметрСоединения = 
			"File=""" + ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "ПутьКБазе"]
			+ """;Usr=""" + ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Логин"]
			+ """;Pwd=""" + ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Пароль"] + """;";	
	Иначе
		ПараметрСоединения = 
			"Srvr=""" + ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Сервер"]
			+ """;Ref=""" + ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "ПутьКБазе"] 
			+ """;Usr=""" + ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Логин"] 
			+ """;Pwd=""" + ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Пароль"] + """;";
	КонецЕсли;
			
	Попытка
		COMConnector = Новый COMОбъект(ЭтотОбъект["ВерсияПлатформыВнешнейБазы" + ИдентификаторБазы] + ".COMConnector");
		Подключение = COMConnector.Connect(ПараметрСоединения);
		ПодключениеВыполненоУспешно = Истина;
	Исключение
		ТекстОшибки = ОписаниеОшибки();
		ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
	КонецПопытки;
		
	Подключение = Неопределено;
	
	Возврат ПодключениеВыполненоУспешно;
	
КонецФункции

Функция ПроверитьВозможностьПодключенияКБазеДанныхSQL(ИдентификаторБазы, ТекстОшибок)
	
	ПодключениеВыполненоУспешно = Ложь;
	
	ServerName =  ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Сервер"];
	DSN 	= ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "ПутьКБазе"];                                                                                                           
	UID 	= ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Логин"];
	PWD 	= ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "Пароль"];
	Driver 	= ЭтотОбъект["ПодключениеКВнешнейБазе" + ИдентификаторБазы + "ДрайверSQL"];
	
	Попытка              
		ConnectString = "Driver={" + Driver + "};Server="+ServerName+";Database="+DSN+";Uid="+UID+";Pwd="+PWD;
		Соединение = Новый COMОбъект("ADODB.Connection");
		Соединение.Open(ConnectString); 
		ПодключениеВыполненоУспешно = Истина;
	Исключение
		ТекстОшибки = ОписаниеОшибки();
		ТекстОшибок = ТекстОшибок + Символы.ПС + ТекстОшибки;
	КонецПопытки;
	
	Попытка
		Соединение.Close();
	Исключение
	КонецПопытки; 
	
	Возврат ПодключениеВыполненоУспешно;
	
КонецФункции
#КонецОбласти

ЧислоРеквизитов = 5;
КодПриведенияРеквизитаКТипуЧисло = "РТек = Число(РТек);";
ПредставленияЗаголовковРеквизитов = Новый Соответствие;

Для СчетчикРеквизитов = 1 По ЧислоРеквизитов Цикл

	ПредставленияЗаголовковРеквизитов.Вставить("А" + СчетчикРеквизитов , "Реквизит А" + СчетчикРеквизитов);
	ПредставленияЗаголовковРеквизитов.Вставить("Б" + СчетчикРеквизитов , "Реквизит Б" + СчетчикРеквизитов);

КонецЦикла; 